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

Бенчмарки

Чтение APIсписок, карточка, статистика, ноды · ↑ запросов/с
GoWave1 169
Remnawave555
ПодпискиXray JSON, Mihomo, sing-box · ↑ запросов/с
GoWave561
Remnawave400
Память под нагрузкойконтейнер панели, медиана · ↓ МиБ
GoWave60
Remnawave1 036
Запускдо первого ответа API · ↓ мс
GoWave209
Remnawave7 061

GitHub Actions (4 vCPU), Docker, по 2 CPU и 2 ГиБ на панель, PostgreSQL 17 (1 CPU) у каждой, 1000 пользователей, 32 одновременных клиента. Медиана 3 прогонов по 20 с. Remnawave 3.4.5.

  • Remnawave 3.4.5 (remnawave/backend:3.4.5) против GoWave на коммите 349f8ed.
  • Прогон в GitHub Actions на раннере с 4 vCPU (AMD EPYC 7763) и 16 ГБ RAM. Логи, сырые результаты и workflow открыты, прогон можно повторить.
  • Docker, у каждой панели лимит 2 CPU и 2 ГиБ, свой PostgreSQL 17 с 1 CPU и одинаковыми настройками. У Remnawave дополнительно Valkey (0,5 CPU), без которого она не работает.
  • Одинаковые данные, созданные через API каждой панели: 1000 пользователей, 20 хостов, профиль и сквад.
  • Нагрузку даёт k6 1.6.1: каждая итерация - один HTTP-запрос. Ответы проверяются: ошибка, пустая подписка или HTML считаются неуспешными.
  • Порядок прогонов чередуется и перемешивается; перед каждым - прогрев. Каждый прогон длится 20 секунд, повторов три, в таблицах - медиана.
  • Перед каждым прогоном в базе обеих панелей выполняются CHECKPOINT и VACUUM ANALYZE, чтобы предыдущий прогон не замедлял следующий.
  • Задержка - время ответа сервера (timings.duration в k6), p99 - медиана по прогонам.

Режим concurrency: заданное число клиентов отправляет запросы без пауз, следующий - сразу после ответа. Так видно, сколько запросов в секунду панель реально выдерживает.

НагрузкаКлиентыGoWave, запросов/сp99, msRemnawave, запросов/сp99, msGoWave / Remnawave
Чтение (смесь)14724,02827,11,67×
Чтение (смесь)81 08415,857338,41,89×
Чтение (смесь)321 16962,6555122,02,11×
Чтение (смесь)1281 181254,1553 †556,82,14×
Подписки12704,62254,81,20×
Подписки855725,637033,41,51×
Подписки32561109,5400131,11,40×
Подписки128555451,6395 †579,41,40×
Смешанная13604,12517,01,44×
Смешанная877920,546332,41,68×
Смешанная3283380,2470134,31,77×
Смешанная128823359,1475 †540,91,73×
Запись14952,72855,01,74×
Запись81 44911,263419,82,28×
Запись321 46751,865276,52,25×
Запись1281 450225,7670288,92,16×
Список пользователей12424,51578,61,54×
Список пользователей850728,022776,92,23×
Список пользователей32508119,1213324,62,39×
Список пользователей128500513,4211 †1 111,82,38×
Карточка пользователя18271,75642,61,46×
Карточка пользователя82 2427,81 17010,91,92×
Карточка пользователя322 35132,21 20640,61,95×
Карточка пользователя1282 333125,21 193165,31,95×
Статистика16632,12875,02,31×
Статистика83 0465,563722,34,78×
Статистика324 15521,165078,46,39×
Статистика1284 30370,7649294,16,63×

Знак † означает, что Remnawave не уложилась в SLO: p99 не больше 500 мс и не больше 1 % ошибок.

Режим rate: ровно 100 или 500 запросов в секунду - обе панели справляются, сравнивается время ответа.

НагрузкаЗапросов/сGoWave p50 / p99, msRemnawave p50 / p99, ms
Чтение (смесь)1001,4 / 4,33,2 / 8,1
Чтение (смесь)5001,5 / 10,415,8 / 487,4
Подписки1002,4 / 5,12,9 / 7,2
Подписки5008,3 / 131,8584,3 / 10 000,7
  • Память (медиана по всем прогонам, контейнер панели целиком, включая воркеры): GoWave - около 60 МиБ, Remnawave - около 1036 МиБ.
  • Запуск до первого ответа API с авторизацией (медиана 10 попыток): GoWave - 209 мс, Remnawave - 7,1 с.
  • Статистика от 32 клиентов (до 6,4×) - заслуга объединения одновременных запросов: пока одно вычисление идёт в базе, остальные ждут его результат. Такое «стадо» запросов к одному эндпоинту бывает редко; повседневную разницу лучше показывает один клиент - 2,3×.
  • При записи от 32 клиентов GoWave упирается в свой PostgreSQL, а не в приложение: база с лимитом 1 CPU троттлится в 81-85 % периодов, контейнер панели - нет.
  • Ноды в тесте не участвуют. Не измерялись работа с нодами, сбор трафика, HWID и реальные VPN-клиенты - только API панели.
  • Это общая виртуальная машина GitHub Actions, а не замер предельной мощности: активная панель, её база и k6 делят 4 ядра, прогоны короткие. Цифры показывают соотношение, а не абсолютные пределы.

Сводное сравнение

Тесты лежат в открытом репозитории gowave-bench: сценарии k6, запуск обеих панелей в Docker, подготовка данных и построение графиков. Прогоны идут в GitHub Actions: workflow собирает GoWave из исходников, скачивает образ Remnawave и сравнивает их на одной виртуальной машине.

У каждого прогона открыты логи, характеристики машины и сырые результаты в артефактах. Цифры на этой странице взяты из прогона 40386568113. Чтобы проверить их, сделайте форк репозитория и запустите workflow Benchmark с профилем full.