Нагрузочный тест Orbitra: 480 запросов/с, ноль ошибок, p99 182 мс

Трекер живёт под нагрузкой: каждый клик — это запись, проверка уникальности и редирект. Поэтому перед тегом v1.6.3 мы перестроили конвейер уникальности на базе боевого масштаба и прогнали её ступенчатой нагрузкой k6 на тестовом стенде. Вот цифры.

TL;DR: На базе в 3,9 млн кликов (около миллиона — за последние сутки) Orbitra удерживала 480 запросов/с без единой ошибки, p99 182 мс — на скромном контейнере 2 vCPU / 7 ГБ RAM. Миграция на первом запросе заняла 0,04 с, новый индекс собрался одним проходом крона за 4,8 с, а отчёты по 3,2 млн кликов стали быстрее — с числами, совпадающими с предыдущей версией строка в строку.
Итог: 480 запросов/с без единой ошибки на базе в 3,9 млн кликов — от трекера без ClickHouse, без Redis и без лицензионных платежей.

Зачем мы это прогнали

v1.6.3 сделала фильтр дублей честным к мобильному NAT: ключ уникальности стал IP + user agent вместо голого IP. За одним NAT-IP оператора раньше сталкивались два разных человека — второй получал subid без строки клика в базе, и его конверсии было не к чему привязать.

Изменение потребовало новую колонку ua_hash и составной индекс на базе, которая уже несёт реальный объём. Это самый страшный тип миграции — поэтому перед тегом мы воспроизвели ровно тот путь, который проходит установка пользователя, на данных боевого масштаба.

Стенд

Результаты

Прогон (база 3,2 млн, если не сказано)rpsОшибкиp99CPU
Уники, стоковый FPM (база ~50 тыс.)480046 мс76%
Уники480075 мс77%
Повторные посетители (50 NAT-пар)4800, ~1% через spool14 мс61%
Уники + открытая панель, отчёты обновляются каждые 2 с3200587 мс81%
Уники, тюнинг FPM/nginx, гео-база включена5600187 мс94%
Уники, намеренная перегрузка80027% таймаутов—97%

И репетиция миграции на снимке в 3,9 млн кликов: первый запрос после «обновления» выполнил миграцию 55 за 0,04 с, один проход крона собрал индекс за 4,8 с и досчитал 1 008 085 UA-хэшей за 29,6 с — а NAT-трафик на 480 запросов/с прошёл с нулём ошибок и p99 182 мс, все subid в базе. Прошлая версия в том же сценарии теряла 27 775 subid, новая — ноль.

Две детали напоследок. Даже на 800 запросах/с — за точкой излома — каждый отработанный редирект всё равно записан в базу: перегрузка ухудшает задержку, но не долговечность. И корректность хэшей: выборка в 2 000 строк сверена с PHP crc32 — ни одного расхождения.

Экономика: один клик стоит около 2,5 мс CPU — это потолок ~550–600 запросов/с для 2 vCPU, упор в процессор. На 4 vCPU та же арифметика даёт ~1 000 запросов/с — но это экстраполяция на бумаге, и мы её так и подписываем.

Что стресс-тест поймал до релиза

Половина ценности прогона — баги, которые он выловил. Все закрыты до тега:

Почему это работает

Честные оговорки

Что это значит для вас

Скромный VPS того класса, который большинство гайдов советуют для старта, уже имеет запас под серьёзные дневные объёмы — и над ним не ждёт тарифная сетка за события. Если вы сидите на Keitaro из-за «SQLite не выживет», вот датасет, на который стоит посмотреть.

Orbitra ставится на чистый Ubuntu-сервер примерно за 15 минут — одна команда, а живое демо открыто, если хотите сначала потыкать панель.

FAQ

На каком железе гоняли тест?

На облачном контейнере с 2 vCPU и 7 ГБ RAM под Ubuntu 24.04, nginx и PHP-FPM в стоковой конфигурации от install.sh, а k6 — на той же машине, так что цифры скорее занижены. Абсолютные значения всегда зависят от вашего VPS: вы масштабируете сервер, а не тариф.

Эти результаты относятся к текущей версии?

Тест гоняли на релиз-кандидате v1.6.3. Архитектура хранения (SQLite + очередь записи + индексы уникальности) в текущих версиях та же; изменения после — фичи и интерфейс.

Почему SQLite, а не ClickHouse?

Один файл, режим WAL, никакого отдельного сервера БД. На малых и средних объёмах узкое место — дисковый I/O, а не RAM, поэтому дешёвый VPS уходит далеко. Для стабильно миллионов кликов в день колоночная архитектура сильнее — мы говорим об этом прямо.

Миграция не потеряла данные?

В сценарии повторных посетителей прошлая версия теряла 27 775 subid, новая — ноль. Отчёты по 3,2 млн кликов совпали с предыдущей версией строка в строку.

Читайте также

vs Voluum

Альтернатива Voluum: бесплатный self-hosted трекер

Voluum — от ~$149/мес. Orbitra — бесплатный self-hosted трекер со встроенным клоакингом и 50+ интеграциями. Сравнение и гайд по миграции.

Читать статью →
vs Keitaro

Альтернатива Keitaro: бесплатный self-hosted трекер

Ближайший self-hosted конкурент — но лицензия от $79/мес. Сравнение функций и перенос кампаний в один клик.

Читать статью →