Бенчмарки
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, ms | Remnawave, запросов/с | p99, ms | GoWave / Remnawave |
|---|---|---|---|---|---|---|
| Чтение (смесь) | 1 | 472 | 4,0 | 282 | 7,1 | 1,67× |
| Чтение (смесь) | 8 | 1 084 | 15,8 | 573 | 38,4 | 1,89× |
| Чтение (смесь) | 32 | 1 169 | 62,6 | 555 | 122,0 | 2,11× |
| Чтение (смесь) | 128 | 1 181 | 254,1 | 553 † | 556,8 | 2,14× |
| Подписки | 1 | 270 | 4,6 | 225 | 4,8 | 1,20× |
| Подписки | 8 | 557 | 25,6 | 370 | 33,4 | 1,51× |
| Подписки | 32 | 561 | 109,5 | 400 | 131,1 | 1,40× |
| Подписки | 128 | 555 | 451,6 | 395 † | 579,4 | 1,40× |
| Смешанная | 1 | 360 | 4,1 | 251 | 7,0 | 1,44× |
| Смешанная | 8 | 779 | 20,5 | 463 | 32,4 | 1,68× |
| Смешанная | 32 | 833 | 80,2 | 470 | 134,3 | 1,77× |
| Смешанная | 128 | 823 | 359,1 | 475 † | 540,9 | 1,73× |
| Запись | 1 | 495 | 2,7 | 285 | 5,0 | 1,74× |
| Запись | 8 | 1 449 | 11,2 | 634 | 19,8 | 2,28× |
| Запись | 32 | 1 467 | 51,8 | 652 | 76,5 | 2,25× |
| Запись | 128 | 1 450 | 225,7 | 670 | 288,9 | 2,16× |
| Список пользователей | 1 | 242 | 4,5 | 157 | 8,6 | 1,54× |
| Список пользователей | 8 | 507 | 28,0 | 227 | 76,9 | 2,23× |
| Список пользователей | 32 | 508 | 119,1 | 213 | 324,6 | 2,39× |
| Список пользователей | 128 | 500 | 513,4 | 211 † | 1 111,8 | 2,38× |
| Карточка пользователя | 1 | 827 | 1,7 | 564 | 2,6 | 1,46× |
| Карточка пользователя | 8 | 2 242 | 7,8 | 1 170 | 10,9 | 1,92× |
| Карточка пользователя | 32 | 2 351 | 32,2 | 1 206 | 40,6 | 1,95× |
| Карточка пользователя | 128 | 2 333 | 125,2 | 1 193 | 165,3 | 1,95× |
| Статистика | 1 | 663 | 2,1 | 287 | 5,0 | 2,31× |
| Статистика | 8 | 3 046 | 5,5 | 637 | 22,3 | 4,78× |
| Статистика | 32 | 4 155 | 21,1 | 650 | 78,4 | 6,39× |
| Статистика | 128 | 4 303 | 70,7 | 649 | 294,1 | 6,63× |
Знак † означает, что Remnawave не уложилась в SLO: p99 не больше 500 мс и не больше 1 % ошибок.
Задержка при фиксированной нагрузке
Заголовок раздела «Задержка при фиксированной нагрузке»Режим rate: ровно 100 или 500 запросов в секунду - обе панели справляются, сравнивается время ответа.
| Нагрузка | Запросов/с | GoWave p50 / p99, ms | Remnawave p50 / p99, ms |
|---|---|---|---|
| Чтение (смесь) | 100 | 1,4 / 4,3 | 3,2 / 8,1 |
| Чтение (смесь) | 500 | 1,5 / 10,4 | 15,8 / 487,4 |
| Подписки | 100 | 2,4 / 5,1 | 2,9 / 7,2 |
| Подписки | 500 | 8,3 / 131,8 | 584,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.