@swarmmachina/swm-uws 0.6.0 / raw HTTP
Замеры swm-uws
Изолированный raw HTTP прогон нативного биндинга против закреплённого uWebSockets.js на одном сервере, одном обработчике и одном стенде.
+12,71% к пропускной способности закреплённого upstream
- 100
- connections
- 10
- pipelining
- 10 × 10s
- прогон
- p95 3,635 ms
- swm-uws
- p99 3,896 ms
- swm-uws
- регрессионный порог пройден
Все 10 пар. Без отбора.
Порядок менялся AB/BA, чтобы прогрев и дрейф стенда не давали одной стороне постоянного преимущества. swm-uws выиграл по throughput во всех десяти парах.
- 01
- swm-uws
- 481 759 запр/с
- upstream uWS
- 429 215 запр/с
- дельта
- +12,24%
- p99
- 4,053 / 4,475 мс
- 02
- swm-uws
- 484 113 запр/с
- upstream uWS
- 425 257 запр/с
- дельта
- +13,84%
- p99
- 3,974 / 4,475 мс
- 03
- swm-uws
- 499 080 запр/с
- upstream uWS
- 434 250 запр/с
- дельта
- +14,93%
- p99
- 3,896 / 4,387 мс
- 04
- swm-uws
- 500 261 запр/с
- upstream uWS
- 448 291 запр/с
- дельта
- +11,59%
- p99
- 3,896 / 4,301 мс
- 05
- swm-uws
- 497 510 запр/с
- upstream uWS
- 439 557 запр/с
- дельта
- +13,18%
- p99
- 3,896 / 4,387 мс
- 06
- swm-uws
- 483 383 запр/с
- upstream uWS
- 441 113 запр/с
- дельта
- +9,58%
- p99
- 4,053 / 4,387 мс
- 07
- swm-uws
- 506 037 запр/с
- upstream uWS
- 430 500 запр/с
- дельта
- +17,55%
- p99
- 3,819 / 4,475 мс
- 08
- swm-uws
- 495 532 запр/с
- upstream uWS
- 434 787 запр/с
- дельта
- +13,97%
- p99
- 3,896 / 4,387 мс
- 09
- swm-uws
- 495 049 запр/с
- upstream uWS
- 443 162 запр/с
- дельта
- +11,71%
- p99
- 3,896 / 4,301 мс
- 10
- swm-uws
- 490 719 запр/с
- upstream uWS
- 440 558 запр/с
- дельта
- +11,39%
- p99
- 3,974 / 4,387 мс
Throughput, хвосты и runtime
Throughput читается вместе с p95, p99, ELU и памятью. Меньшая задержка и память здесь важны не меньше итогового темпа.
| Метрика | swm-uws | upstream uWS | дельта | Как читать |
|---|---|---|---|---|
| Throughput | 495 290 запр/с | 437 172 запр/с | +12,71% | больше лучше |
| Задержка p95 | 3,635 мс | 4,134 мс | -12,07% | меньше лучше |
| Задержка p99 | 3,896 мс | 4,387 мс | -11,20% | меньше лучше |
| ELU сервера | 98,29% | 98,27% | +0,01% | контекст |
| RSS после прогрева | 59,59 MiB | 60,51 MiB | -1,51% | меньше лучше |
| Heap used после прогрева | 5,71 MiB | 6,07 MiB | -5,86% | меньше лучше |
Вывод по хвостам: медиана p95 у swm-uws составила 3,635 мс, p99 - 3,896 мс. У закреплённого upstream: 4,134 и 4,387 мс соответственно. Ошибок запросов не было.
CPU-счётчики на один ответ
Независимый perf stat запуск повторил профиль нагрузки и нормализовал аппаратные счётчики на один HTTP-ответ.
490 740запр/с
p99 3,974мс
- 5 600,65
- cycles · на запрос
- 9 177,51
- instructions · на запрос
- 1 878,95
- branches · на запрос
- 7,657
- branch misses · на запрос
- 69,89
- cache references · на запрос
- 0,131
- cache misses · на запрос
swm-core 4.3.0: проверка биндинга
Отдельный balanced-прогон показывает биндинг в реальном серверном слое. HTTP и WebSocket измерялись по четыре раза с теми же версиями swm-uws и upstream.
| Сценарий | Прогоны | swm-uws | upstream uWS | p95 / p99 | ELU / RSS |
|---|---|---|---|---|---|
| HTTP GET /base-sync | 4 × 6s | 235 200 запр/с +12,66% | 208 768 запр/с | 4,344 / 8,187 мс | 98,72% / 79,74 MiB |
| WebSocket echo · 64 B | 4 × 6s | 104 706 msg/s -0,94% | 105 697 msg/s | 0,839 / 0,891 мс | 98,09% / 66,99 MiB |
Как воспроизвести
Основной релизный результат получен на Linux x64: 100 connections, pipelining 10, 2 секунды прогрева, 10 секунд измерения, 10 сбалансированных пар и 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.22.3 · Linux 6.17.0-40-generic x64 · Intel Xeon E5-2680 v4
- Сборка
- Clang 18 · PGO balanced · LTO · generic x86-64