Навантажувальний тест 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/міс. Порівняння функцій та перенос кампаній в один клік.

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