Перейти к содержимому

Железо и бенчмарки

slimTDS намеренно лёгкий: один процесс FrankenPHP (worker-режим) плюс PostgreSQL. Ни Redis, ни очередей сообщений, ни отдельного пула PHP-FPM. Благодаря этому потребление ресурсов невелико, а требования к железу — скромные.

РесурсМинимумРекомендуется
CPU1 vCPU2–4 vCPU
RAM1 ГБ2–4 ГБ
Диск10 ГБ SSD20+ ГБ SSD (см. хранение)
ОСLinux с Docker + Docker Composeто же
PostgreSQL18 (входит в Compose)18

На 1 ГБ RAM уменьшите число воркеров FrankenPHP (num в Caddyfile) примерно до 2 и следите за shared_buffers в PostgreSQL. 2 ГБ дают комфортный запас для стандартных 8 воркеров.

Основной потребитель диска — база данных, и она растёт вместе с трафиком:

  • stats.clicks — одна строка на клик (RANGE-партиционирование по месяцам, индекс BRIN).
  • stats.pixel_events — одна строка на событие пикселя (партиционируется).
  • stats.rrweb_chunks — записи реплеев сессий, если они включены. Это самый крупный потребитель — порядка ~0,5 ГБ/день при умеренном трафике.

Партиции ротируются помесячно, а старые удаляются за пределами окна хранения (крон partitions:rotate). Если включаете реплеи сессий, закладывайте диск под объём записей или сокращайте срок хранения.

  • Железо: VPS 4 vCPU / 16 ГБ, PostgreSQL 18.
  • Сервер: FrankenPHP worker-режим, 8 воркеров.
  • Инструмент: wrk, keep-alive соединения, реальный браузерный User-Agent.
  • Эндпоинт: горячий путь движка GET /<slug>, который прогоняет весь конвейер — резолв посетителя, GeoIP, детект ботов, детект устройства, матчинг флоу и логирование клика (один INSERT на запрос).
  • Оговорка: генератор нагрузки работал на том же хосте и конкурировал с сервером за CPU. На выделенной машине цифры выше — считайте это консервативной нижней границей.
КонкурентностьПропускная способностьp50p90p99
20~610 req/s32 мс42 мс57 мс
50~635 req/s76 мс91 мс122 мс

Пропускная способность выходит на плато около 635 req/s при насыщенном хосте (и генераторе нагрузки на нём же). Это примерно 50 миллионов кликов/день запаса на небольшом 4-ядерном VPS — для полного конвейера, включая запись клика в базу.

PostgreSQL — не узкое место: суммарное время базы около 1,4 мс на запрос (INSERT клика ~0,8 мс). Всё остальное — PHP: роутинг плюс конвейер движка, обслуживаемые из «тёплого» воркер-процесса.

В комплекте slimTDS есть помощник для бенчмарка. Подними стек (make up) и укажи слаг любой активной кампании:

Окно терминала
make benchmark SLUG=your-slug
# настроить нагрузку:
CONNS=100 DURATION=30s make benchmark SLUG=your-slug

Он запускает нагрузочный тестер fortio во временном контейнере — ставить ничего не нужно, а образ мультиарх, так что работает и на Apple Silicon, и на amd64-серверах. Бьёт в горячий путь движка и печатает пропускную способность, перцентили задержки и разбивку по кодам ответа:

Throughput : 2416.1 qps
Latency percentiles:
p50% 6.36 ms
p90% 14.30 ms
p99% 23.24 ms