@swarmmachina/swm-uws 0.7.2 / raw HTTP
Замеры swm-uws
Изолированный raw HTTP прогон нативного биндинга против закреплённого uWebSockets.js на одном сервере, одном обработчике и одном стенде.
+5,81% к пропускной способности закреплённого upstream
- 100
- connections
- 10
- pipelining
- 6 × 5s
- прогон
- p95 3,782 ms
- swm-uws
- p99 4,344 ms
- swm-uws
- регрессионный порог пройден
Все 6 пар. Без отбора.
Порядок менялся AB/BA, чтобы прогрев и дрейф стенда не давали одной стороне постоянного преимущества. swm-uws выиграл по throughput в 4 из 6 пар.
- 01
- swm-uws
- 433 346 запр/с
- upstream uWS
- 436 476 запр/с
- дельта
- -0,72%
- p99
- 4,565 / 4,656 мс
- 02
- swm-uws
- 411 926 запр/с
- upstream uWS
- 453 706 запр/с
- дельта
- -9,21%
- p99
- 4,749 / 4,387 мс
- 03
- swm-uws
- 487 614 запр/с
- upstream uWS
- 452 755 запр/с
- дельта
- +7,70%
- p99
- 4,387 / 4,475 мс
- 04
- swm-uws
- 470 326 запр/с
- upstream uWS
- 441 473 запр/с
- дельта
- +6,54%
- p99
- 4,301 / 4,565 мс
- 05
- swm-uws
- 476 814 запр/с
- upstream uWS
- 401 785 запр/с
- дельта
- +18,67%
- p99
- 4,301 / 4,941 мс
- 06
- swm-uws
- 477 410 запр/с
- upstream uWS
- 454 353 запр/с
- дельта
- +5,07%
- p99
- 4,301 / 4,475 мс
Throughput, хвосты и runtime
Throughput читается вместе с p95, p99, ELU и памятью. Меньшая задержка и память здесь важны не меньше итогового темпа.
| Метрика | swm-uws | upstream uWS | дельта | Как читать |
|---|---|---|---|---|
| Throughput | 473 570 запр/с | 447 114 запр/с | +5,81% | больше лучше |
| Задержка p95 | 3,782 мс | 4,013 мс | -5,77% | меньше лучше |
| Задержка p99 | 4,344 мс | 4,520 мс | -3,88% | меньше лучше |
| ELU сервера | 96,64% | 96,70% | -0,07% | контекст |
| RSS после прогрева | 58,94 MiB | 59,65 MiB | -1,20% | меньше лучше |
| Heap used после прогрева | 5,22 MiB | 6,07 MiB | -14,00% | меньше лучше |
Вывод по хвостам: медиана p95 у swm-uws составила 3,782 мс, p99 - 4,344 мс. У закреплённого upstream: 4,013 и 4,520 мс соответственно. Ошибок запросов не было.
CPU-счётчики на один ответ
Независимый perf stat запуск повторил профиль нагрузки и нормализовал аппаратные счётчики на один HTTP-ответ.
463 062запр/с
p99 4,475мс
- 5 851,51
- cycles · на запрос
- 9 427,79
- instructions · на запрос
- 2 072,49
- branches · на запрос
- 8,670
- branch misses · на запрос
- 72,70
- cache references · на запрос
- 0,056
- cache misses · на запрос
swm-core 5.1.0: проверка биндинга
Отдельный balanced-прогон показывает биндинг в реальном серверном слое. HTTP и WebSocket измерялись по четыре раза с теми же версиями swm-uws и upstream.
| Сценарий | Прогоны | swm-uws | upstream uWS | p95 / p99 | ELU / RSS |
|---|---|---|---|---|---|
| HTTP GET /base-sync | 4 × 6s | 219 044 запр/с +3,44% | 211 768 запр/с | 4,656 / 8,862 мс | 98,72% / 80,42 MiB |
| WebSocket echo · 64 B | 4 × 6s | 104 033 msg/s +1,04% | 102 967 msg/s | 0,857 / 0,900 мс | 97,98% / 67,17 MiB |
Как воспроизвести
Основной релизный результат получен на Linux x64: 100 connections, pipelining 10, 2 секунды прогрева, 5 секунд измерения, 6 сбалансированных пар и 4 client workers.
Команда релизного Linux-прогона
npm run build:native:pgo
SWM_BENCH_REFERENCE=/path/to/uwebsockets.js/ESM_wrapper.mjs \
npm run bench:compare:pgo:linux -- benchmark/profiles/pgo-balanced-linux- Стенд
- Node.js 22.23.1 · Linux 6.17.0-40-generic x64 · Intel Xeon CPU E5-2680 v4
- Сборка
- Clang 18 · PGO balanced · LTO · generic x86-64