Skip to content

Add Proxygen and Proxygen Coro engines - #1097

Draft
lnicco wants to merge 5 commits into
MDA2AV:mainfrom
lnicco:proxygen-engines-draft
Draft

Add Proxygen and Proxygen Coro engines#1097
lnicco wants to merge 5 commits into
MDA2AV:mainfrom
lnicco:proxygen-engines-draft

Conversation

@lnicco

@lnicco lnicco commented Aug 10, 2026

Copy link
Copy Markdown

Early review requested. The implementation is complete, but this PR is intentionally draft while the engine shape and shared harness changes are reviewed.

Summary

  • support bridge-mode local runs with configurable HTTP/1.1, TLS, h2c, HTTP/2, and HTTP/3 ports
  • strengthen RFC 6455 WebSocket validation and documentation
  • add the regular Proxygen engine
  • add Proxygen Coro as a separate coroutine-based engine
  • track the official ghcr.io/facebook/proxygen/base:latest builder image

Both engines cover the same 18 profiles across HTTP/1.1, HTTP/2, HTTP/3, static files, JSON, upload, and WebSockets.

Validation

  • canonical Proxygen Coro validation: 76/76
  • WebSocket validation: 20/20
  • direct HTTP/3 baseline and static checks: 100/100 each
  • short full benchmark: 38/38 result points with no HTTP 4xx/5xx responses
  • no-cache builds of both engines against the current Proxygen base:latest image
  • intermediate commit syntax and patch checks

lnicco added 5 commits August 8, 2026 07:22
Allow bridge-mode port remapping for HTTP/1.1, TLS, h2c, HTTP/2,
and HTTP/3 without changing production host networking. Add a minimal
rootless Podman shim and start PostgreSQL only for profiles that need it.
Exercise RFC 6455 handshake, framing, fragmentation, UTF-8, ping/pong,
and close behavior. Surface validator crashes as failures and document
the expanded checks.
Add a pinned, non-root Proxygen image with HTTP/1.1, TLS, h2c,
HTTP/2, HTTP/3, static, JSON, upload, and RFC 6455 WebSocket support
across 18 benchmark profiles.
Add a pinned, non-root Proxygen coroutine image using
proxygen::coro::HTTPHandler and HTTPSourceHolder across the same 18
HTTP/1.1, TLS, h2c, HTTP/2, HTTP/3, static, JSON, upload, and
WebSocket profiles.
Use the official ghcr.io/facebook/proxygen/base:latest tag for both
the regular and coroutine engines, and update their documentation to
reflect the rolling upstream builder.
Repository owner deleted a comment from github-actions Bot Aug 11, 2026
Repository owner deleted a comment from github-actions Bot Aug 11, 2026
@MDA2AV

MDA2AV commented Aug 11, 2026

Copy link
Copy Markdown
Owner

/benchmark -f proxygen

@github-actions

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@MDA2AV

MDA2AV commented Aug 11, 2026

Copy link
Copy Markdown
Owner

/benchmark -f proxygen-coro

@github-actions

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: proxygen | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,834,143 6827.9% 86MiB ~0% ~0%
baseline 4096 1,897,107 6355.9% 112MiB ~0% ~0%
pipelined 512 1,760,983 6722.7% 63MiB ~0% ~0%
pipelined 4096 1,738,885 6781.0% 145MiB ~0% ~0%
limited-conn 512 1,070,302 6012.3% 76MiB ~0% ~0%
limited-conn 4096 1,066,125 6011.8% 73MiB ~0% ~0%
json 4096 583,947 6610.7% 171MiB ~0% ~0%
json-comp 512 218,562 6418.8% 686MiB ~0% ~0%
json-comp 4096 211,947 6465.3% 2.0GiB ~0% ~0%
json-comp 16384 207,102 6484.6% 3.2GiB ~0% ~0%
json-tls 4096 513,071 6573.6% 188MiB ~0% ~0%
upload 32 2,573 2459.7% 54MiB ~0% ~0%
upload 256 3,110 3500.6% 79MiB ~0% ~0%
static 1024 30,044 6417.3% 341MiB ~0% ~0%
static 4096 30,008 6418.3% 1.3GiB ~0% ~0%
static 6800 30,056 6366.3% 2.1GiB ~0% ~0%
static-tls 1024 29,479 6417.6% 344MiB ~0% ~0%
static-tls 4096 28,770 6300.6% 1.2GiB ~0% ~0%
static-tls 6800 28,584 6433.8% 2.0GiB ~0% ~0%
baseline-h2 256 5,482,087 6315.2% 100MiB ~0% ~0%
baseline-h2 1024 4,953,695 6323.2% 250MiB ~0% ~0%
static-h2 256 145,947 6281.6% 794MiB ~0% ~0%
static-h2 1024 147,279 6228.1% 3.1GiB ~0% ~0%
baseline-h2c 256 4,966,520 6423.4% 104MiB ~0% ~0%
baseline-h2c 1024 4,906,600 6419.2% 256MiB ~0% ~0%
baseline-h2c 4096 4,522,392 6378.5% 863MiB ~0% ~0%
json-h2c 1024 767,903 6405.6% 319MiB ~0% ~0%
json-h2c 4096 728,576 6139.6% 1.1GiB ~0% ~0%
baseline-h3 64 1,458,970 4345.3% 515MiB ~0% ~0%
static-h3 64 30,768 3777.2% 1.4GiB ~0% ~0%
echo-ws 512 3,034,641 6697.0% 61MiB ~0% ~0%
echo-ws 4096 3,290,882 6388.8% 102MiB ~0% ~0%
echo-ws 16384 3,143,039 6343.3% 171MiB ~0% ~0%
echo-ws-pipeline 512 36,833,888 6623.7% 63MiB ~0% ~0%
echo-ws-pipeline 4096 37,701,132 6248.9% 109MiB ~0% ~0%
echo-ws-pipeline 16384 36,726,682 6037.4% 221MiB ~0% ~0%
echo-ws-limited 512 972,701 4496.3% 60MiB ~0% ~0%
echo-ws-limited 4096 1,020,695 4643.7% 65MiB ~0% ~0%
Full log
  WS frames:   167683313
  Latency samples: 167683313 / 167683313 responses (100.0%)
[info] CPU 6562.7% | Mem 236MiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     16384 (256/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   3.07ms   3.26ms   4.44ms   7.04ms   8.08ms

  183773986 frames sent in 5.00s, 183633410 frames received
  Throughput: 36.72M req/s
  Bandwidth:  245.38MB/s
  WS upgrades: 8786
  WS frames:   183633410
  Latency samples: 183633410 / 183633410 responses (100.0%)
[info] CPU 6037.4% | Mem 221MiB

=== Best: 36726682 req/s (CPU: 6037.4%, Mem: 221MiB) ===
[info] saved results/echo-ws-pipeline/16384/proxygen.json
httparena-bench-proxygen
httparena-bench-proxygen

==============================================
=== proxygen / echo-ws-limited / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     79us     62us    124us    322us   1.05ms

  4741329 frames sent in 5.00s, 4741271 frames received
  Throughput: 947.99K req/s
  Bandwidth:  21.34MB/s
  WS upgrades: 481456
  WS frames:   4741271
  Latency samples: 4741262 / 4741271 responses (100.0%)
  Reconnects: 474099
[info] CPU 4305.4% | Mem 61MiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     78us     62us    123us    302us    933us

  4814290 frames sent in 5.00s, 4814279 frames received
  Throughput: 962.53K req/s
  Bandwidth:  21.66MB/s
  WS upgrades: 489399
  WS frames:   4814279
  Latency samples: 4814266 / 4814279 responses (100.0%)
  Reconnects: 481422
[info] CPU 4473.2% | Mem 58MiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     78us     62us    123us    294us    862us

  4863492 frames sent in 5.00s, 4863509 frames received
  Throughput: 972.40K req/s
  Bandwidth:  21.89MB/s
  WS upgrades: 494179
  WS frames:   4863509
  Latency samples: 4863491 / 4863509 responses (100.0%)
  Reconnects: 486362
[info] CPU 4496.3% | Mem 60MiB

=== Best: 972701 req/s (CPU: 4496.3%, Mem: 60MiB) ===
[info] saved results/echo-ws-limited/512/proxygen.json
httparena-bench-proxygen
httparena-bench-proxygen

==============================================
=== proxygen / echo-ws-limited / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     77us     63us    124us    262us    625us

  4991280 frames sent in 5.00s, 4991341 frames received
  Throughput: 998.01K req/s
  Bandwidth:  22.46MB/s
  WS upgrades: 502998
  WS frames:   4991341
  Latency samples: 4991320 / 4991341 responses (100.0%)
  Reconnects: 499162
[info] CPU 4466.9% | Mem 62MiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     77us     63us    125us    252us    581us

  5058869 frames sent in 5.00s, 5058908 frames received
  Throughput: 1.01M req/s
  Bandwidth:  22.77MB/s
  WS upgrades: 509291
  WS frames:   5058908
  Latency samples: 5058887 / 5058908 responses (100.0%)
  Reconnects: 505909
[info] CPU 4697.6% | Mem 65MiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     77us     63us    124us    243us    517us

  5103427 frames sent in 5.00s, 5103475 frames received
  Throughput: 1.02M req/s
  Bandwidth:  22.97MB/s
  WS upgrades: 513452
  WS frames:   5103475
  Latency samples: 5103456 / 5103475 responses (100.0%)
  Reconnects: 510373
[info] CPU 4643.7% | Mem 65MiB

=== Best: 1020695 req/s (CPU: 4643.7%, Mem: 65MiB) ===
[info] saved results/echo-ws-limited/4096/proxygen.json
httparena-bench-proxygen
httparena-bench-proxygen
[info] rebuilding site/data/*.json
[purged stale] cardigan.json (Cardigan)
[purged stale] http-kit.json (http-kit)
[purged stale] ring-jetty9-adapter.json (ring-jetty9-adapter)
[purged stale] ring.json (ring)
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/proxygen.json - 38 new, 38 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
[info] restoring loopback MTU to 65536

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: proxygen-coro | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,141,911 6724.4% 100MiB ~0% ~0%
baseline 4096 1,379,620 6749.5% 153MiB ~0% ~0%
pipelined 512 1,459,242 6758.8% 87MiB ~0% ~0%
pipelined 4096 1,450,746 6760.4% 197MiB ~0% ~0%
limited-conn 512 886,440 6582.2% 155MiB ~0% ~0%
limited-conn 4096 1,006,206 6663.1% 185MiB ~0% ~0%
json 4096 519,227 6394.9% 185MiB ~0% ~0%
json-comp 512 141,216 6483.1% 108MiB ~0% ~0%
json-comp 4096 230,926 6340.2% 214MiB ~0% ~0%
json-comp 16384 218,925 6191.9% 366MiB ~0% ~0%
json-tls 4096 501,855 6576.5% 203MiB ~0% ~0%
upload 32 2,501 2435.2% 91MiB ~0% ~0%
upload 256 3,187 3794.3% 134MiB ~0% ~0%
static 1024 41,081 6407.0% 260MiB ~0% ~0%
static 4096 40,999 6430.2% 429MiB ~0% ~0%
static 6800 40,985 6428.5% 592MiB ~0% ~0%
static-tls 1024 40,078 6397.3% 233MiB ~0% ~0%
static-tls 4096 39,439 6379.1% 483MiB ~0% ~0%
static-tls 6800 39,167 6319.8% 653MiB ~0% ~0%
baseline-h2 256 3,662,281 6423.5% 137MiB ~0% ~0%
baseline-h2 1024 3,332,800 6351.6% 336MiB ~0% ~0%
static-h2 256 40,449 6347.0% 519MiB ~0% ~0%
static-h2 1024 39,274 6402.6% 2.0GiB ~0% ~0%
baseline-h2c 256 3,799,701 6419.8% 137MiB ~0% ~0%
baseline-h2c 1024 3,312,228 6420.2% 314MiB ~0% ~0%
baseline-h2c 4096 3,012,043 6420.4% 1.1GiB ~0% ~0%
json-h2c 1024 715,907 6403.2% 241MiB ~0% ~0%
json-h2c 4096 684,817 6087.2% 746MiB ~0% ~0%
baseline-h3 64 1,653,717 4297.8% 212MiB ~0% ~0%
static-h3 64 26,143 4325.3% 535MiB ~0% ~0%
echo-ws 512 1,776,610 6745.6% 90MiB ~0% ~0%
echo-ws 4096 1,963,292 6657.0% 173MiB ~0% ~0%
echo-ws 16384 1,685,278 6632.3% 344MiB ~0% ~0%
echo-ws-pipeline 512 17,163,839 6720.0% 87MiB ~0% ~0%
echo-ws-pipeline 4096 18,960,249 6485.8% 177MiB ~0% ~0%
echo-ws-pipeline 16384 17,054,592 6671.8% 369MiB ~0% ~0%
echo-ws-limited 512 1,032,095 6547.7% 127MiB ~0% ~0%
echo-ws-limited 4096 1,020,393 6543.7% 142MiB ~0% ~0%
Full log
  WS frames:   85272960
  Latency samples: 85272960 / 85272960 responses (100.0%)
[info] CPU 6671.8% | Mem 369MiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     16384 (256/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   9.59ms   10.70ms   13.50ms   14.50ms   15.00ms

  83511937 frames sent in 5.00s, 83286177 frames received
  Throughput: 16.65M req/s
  Bandwidth:  111.62MB/s
  WS upgrades: 14110
  WS frames:   83286177
  Latency samples: 83286177 / 83286177 responses (100.0%)
[info] CPU 6198.7% | Mem 415MiB

=== Best: 17054592 req/s (CPU: 6671.8%, Mem: 369MiB) ===
[info] saved results/echo-ws-pipeline/16384/proxygen-coro.json
httparena-bench-proxygen-coro
httparena-bench-proxygen-coro

==============================================
=== proxygen-coro / echo-ws-limited / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    227us    175us    320us   1.30ms   4.18ms

  5160414 frames sent in 5.00s, 5160479 frames received
  Throughput: 1.03M req/s
  Bandwidth:  23.22MB/s
  WS upgrades: 521994
  WS frames:   5160479
  Latency samples: 5160460 / 5160479 responses (100.0%)
  Reconnects: 516071
[info] CPU 6547.7% | Mem 127MiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    221us    173us    306us   1.24ms   4.03ms

  5151369 frames sent in 5.00s, 5151364 frames received
  Throughput: 1.03M req/s
  Bandwidth:  23.18MB/s
  WS upgrades: 523320
  WS frames:   5151364
  Latency samples: 5151337 / 5151364 responses (100.0%)
  Reconnects: 515136
[info] CPU 6660.8% | Mem 131MiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    224us    174us    321us   1.19ms   3.93ms

  5137255 frames sent in 5.00s, 5137333 frames received
  Throughput: 1.03M req/s
  Bandwidth:  23.12MB/s
  WS upgrades: 521804
  WS frames:   5137333
  Latency samples: 5137318 / 5137333 responses (100.0%)
  Reconnects: 513780
[info] CPU 6549.1% | Mem 135MiB

=== Best: 1032095 req/s (CPU: 6547.7%, Mem: 127MiB) ===
[info] saved results/echo-ws-limited/512/proxygen-coro.json
httparena-bench-proxygen-coro
httparena-bench-proxygen-coro

==============================================
=== proxygen-coro / echo-ws-limited / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    212us    164us    341us   1.03ms   3.54ms

  5099774 frames sent in 5.00s, 5099739 frames received
  Throughput: 1.02M req/s
  Bandwidth:  22.95MB/s
  WS upgrades: 511292
  WS frames:   5099739
  Latency samples: 5099723 / 5099739 responses (100.0%)
  Reconnects: 509937
[info] CPU 6262.4% | Mem 124MiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    230us    161us    339us   1.58ms   5.89ms

  5101970 frames sent in 5.00s, 5101966 frames received
  Throughput: 1.02M req/s
  Bandwidth:  22.96MB/s
  WS upgrades: 512069
  WS frames:   5101966
  Latency samples: 5101959 / 5101966 responses (100.0%)
  Reconnects: 510190
[info] CPU 6543.7% | Mem 142MiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    249us    163us    369us   1.90ms   5.52ms

  5060979 frames sent in 5.00s, 5061510 frames received
  Throughput: 1.01M req/s
  Bandwidth:  22.77MB/s
  WS upgrades: 508942
  WS frames:   5061510
  Latency samples: 5061491 / 5061510 responses (100.0%)
  Reconnects: 506355
[info] CPU 6188.3% | Mem 156MiB

=== Best: 1020393 req/s (CPU: 6543.7%, Mem: 142MiB) ===
[info] saved results/echo-ws-limited/4096/proxygen-coro.json
httparena-bench-proxygen-coro
httparena-bench-proxygen-coro
[info] rebuilding site/data/*.json
[purged stale] cardigan.json (Cardigan)
[purged stale] http-kit.json (http-kit)
[purged stale] ring-jetty9-adapter.json (ring-jetty9-adapter)
[purged stale] ring.json (ring)
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/proxygen-coro.json - 38 new, 38 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
[info] restoring loopback MTU to 65536

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants