Skip to content

[true-async] HTTP/3 + bump to v0.7.0-rc.4 (patched libuv + H3 stream-credit fix)#772

Merged
MDA2AV merged 4 commits into
MDA2AV:mainfrom
EdmondDantes:h3-arena-rc4
Jun 1, 2026
Merged

[true-async] HTTP/3 + bump to v0.7.0-rc.4 (patched libuv + H3 stream-credit fix)#772
MDA2AV merged 4 commits into
MDA2AV:mainfrom
EdmondDantes:h3-arena-rc4

Conversation

@EdmondDantes
Copy link
Copy Markdown
Contributor

What

Re-runs true-async-server with trueasync/php-true-async:0.7.0-rc.4-php8.6 (was rc.3 in the closed #771).

rc.4 = rc.3 +

  • Patched libuv (true-async/libuv): skip a redundant EPOLL_CTL_MOD when the interest mask is unchanged → one fewer io_uring_enter per request on the keep-alive path (measured 21→1 over 20 keep-alive reqs; matters at high core counts).
  • server v0.7.1 (Add Rails: Ruby on Rails in API mode on Puma (~58k ⭐) #79): HTTP/3 now replenishes the bidi stream credit (ngtcp2_conn_extend_max_streams_bidi). Fixes the per-connection cap at initial_max_streams_bidi (100) that crushed baseline-h3/static-h3 to ~1,277 rps (~20/conn). Verified locally: single QUIC conn now serves 200/200 (was capped at 100).

async / php-src unchanged from rc.3.

Requesting a benchmark run to confirm H3 recovers and H1/H2 hold.

The server gained a working HTTP/3 listener (35 phpt green, incl. E2E GET/
POST/streaming/static over QUIC). entry.php already binds the H3 UDP listener
on :8443 by default; it just wasn't being benchmarked because meta.json
subscribed to no h3 profile.

Subscribe baseline-h3 + static-h3 so the arena actually exercises HTTP/3.
A 120-iteration back-to-back restart repro (16 and 64 workers) showed 0
startup failures with the H3 listener on, so no per-profile gating is needed —
h2 (TCP :8443) and h3 (QUIC UDP :8443) coexist as designed.
Pin to trueasync/php-true-async:0.7.0-rc.3-php8.6 — the first published image
carrying server v0.7.0, which ships the HTTP/3 / QUIC listener (ngtcp2 1.22.1 +
nghttp3 1.15.0). Pairs with subscribing baseline-h3 + static-h3 so the arena
actually exercises HTTP/3. Also document the QUIC UDP port (8443/udp) in EXPOSE.
# Conflicts:
#	frameworks/true-async-server/Dockerfile
rc.4 = rc.3 + patched libuv (true-async/libuv: skip redundant
EPOLL_CTL_MOD, one io_uring_enter/request saved on keep-alive) and
server v0.7.1 (HTTP/3 bidi stream-credit replenish, MDA2AV#79) — lifts the
per-connection 100-request cap that crushed baseline-h3/static-h3.
@EdmondDantes
Copy link
Copy Markdown
Contributor Author

/benchmark -f true-async-server

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

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

@EdmondDantes EdmondDantes reopened this Jun 1, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

Benchmark Results

Framework: true-async-server | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,438,838 6361.1% 185MiB -33.2% +1.6%
baseline 4096 1,370,507 6097.7% 206MiB -39.4% -6.4%
pipelined 512 2,349,716 6345.4% 150MiB -73.9% ~0%
pipelined 4096 1,330,984 6253.9% 220MiB -42.0% -10.2%
limited-conn 512 1,246,236 5962.1% 157MiB -22.6% ~0%
limited-conn 4096 1,280,897 6336.2% 194MiB -28.8% +17.6%
json 4096 867,490 6538.1% 263MiB -11.8% -0.4%
json-comp 512 409,671 5827.8% 181MiB -7.9% +3.4%
json-comp 4096 432,179 6469.1% 267MiB -5.7% +5.1%
json-comp 16384 419,177 6530.9% 500MiB -4.8% +2.7%
json-tls 4096 710,400 6545.4% 629MiB -9.2% +0.3%
upload 32 2,497 1879.8% 272MiB -3.3% -9.9%
upload 256 3,042 3441.2% 536MiB +0.7% +3.1%
api-4 256 50,752 394.3% 42MiB -9.9% ~0%
api-16 1024 142,349 1579.2% 83MiB -6.8% +7.8%
static 1024 490,724 2592.9% 180MiB -19.6% +2.9%
static 4096 500,414 2676.6% 258MiB -19.9% +2.4%
static 6800 448,259 2502.8% 319MiB -26.6% +4.2%
async-db 1024 247,469 5108.8% 237MiB -1.0% -4.4%
fortunes 1024 89,329 6403.2% 228MiB +0.8% +1.8%
baseline-h2 256 4,808,721 5992.2% 236MiB -3.2% +4.9%
baseline-h2 1024 3,649,540 6341.2% 536MiB +11.0% +6.1%
static-h2 256 1,045,236 6483.5% 510MiB +1.0% -8.8%
static-h2 1024 814,577 6347.0% 2.0GiB -1.9% -13.0%
baseline-h2c 256 5,769,641 6216.1% 251MiB -4.4% +2.9%
baseline-h2c 1024 4,326,300 6490.3% 575MiB +8.4% +8.9%
baseline-h2c 4096 3,756,909 6006.2% 1.5GiB ~0% ~0%
json-h2c 1024 1,423,436 6513.1% 328MiB +15.5% +2.8%
json-h2c 4096 1,388,656 6528.7% 828MiB +14.1% +6.0%
baseline-h3 64 1,413,808 4381.6% 184MiB NEW NEW
static-h3 64 545,670 4531.5% 658MiB NEW NEW
Full log

49. Stopping all clients.

55. Stopping all clients.
50. Stopping all clients.
23. Stopping all clients.
0. Stopping all clients.

finished in 5.01s, 485097.60 req/s, 4.16MB/s
requests: 2425488 total, 2426512 started, 2425488 done, 2425488 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 2425488 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 20.82MB (21829728) total, 9.25MB (9701992) headers (space savings 87.50%), 2.31MB (2425498) data
UDP datagram: 1537739 sent, 2504463 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      629us      5.15ms      2.56ms     3.90ms     3.94ms     2.57ms      1.07ms    47.95%
connect     :     2.38ms      5.55ms      3.97ms     5.55ms     5.55ms     3.93ms       907us    62.50%
TTFB        :     3.35ms      9.19ms      5.84ms     9.19ms     9.19ms     5.99ms      1.83ms    68.75%
req/s       :       0.00    56548.88        0.00   55968.41   56548.88    7579.33    15375.07    84.38%
min RTT     :        0us       247us         0us      230us      247us       42us        81us    82.81%
smoothed RTT:      170us    333.00ms    333.00ms   333.00ms   333.00ms   249.82ms    145.21ms    75.00%
packets sent:          4      147752           4     144989     147752   24027.67    45008.13    84.38%
packets recv:          0      289575           0     286642     289575   39132.73    79008.86    84.38%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1           2           1          1          1       1.00        0.00   100.00%
[info] CPU 900.0% | Mem 208MiB

=== Best: 1413808 req/s (CPU: 4381.6%, Mem: 184MiB) ===
[info] saved results/baseline-h3/64/true-async-server.json
httparena-bench-true-async-server
httparena-bench-true-async-server

==============================================
=== true-async-server / static-h3 / 64c (tool=h2load-h3) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
starting benchmark...
20.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3Warm-up started for thread #
57.
.


finished in 5.01s, 546622.40 req/s, 8.30GB/s
requests: 2733112 total, 2737208 started, 2733112 done, 2733112 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 2733809 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 41.48GB (44537207830) total, 64.01MB (67117643) headers (space savings 82.07%), 41.40GB (44452469011) data
UDP datagram: 1953170 sent, 33558062 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :     1.52ms    189.49ms      5.98ms    18.25ms    62.63ms     9.10ms     10.49ms    95.26%
connect     :     2.37ms     75.25ms      3.92ms    52.33ms    75.25ms     8.66ms     15.80ms    92.19%
TTFB        :    24.95ms     90.17ms     42.71ms    78.86ms    90.17ms    49.79ms     15.88ms    71.88%
req/s       :    3852.59    15264.12     6601.11   13357.18   15264.12    8540.61     3641.41    57.81%
min RTT     :       18us       100us        35us       95us      100us       48us        23us    71.88%
smoothed RTT:      188us       449us       285us      354us      449us      285us        51us    68.75%
packets sent:      18139       44677       27202      40576      44677   30520.28     8061.24    57.81%
packets recv:     238911      931375      406719     817808     931375  524346.72   221415.99    57.81%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1          46           5         33         34       8.43        8.73    89.73%
[info] CPU 4531.5% | Mem 658MiB

[run 2/3]
starting benchmark...
47.
.
4.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3
47. Stopping all clients.
42. Stopping all clients.
. Stopping all clients.
52. Stopping all clients.
. Stopping all clients.

finished in 5.01s, 364124.80 req/s, 5.53GB/s
requests: 1820624 total, 1822736 started, 1820624 done, 1820624 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 1820986 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 27.63GB (29669432672) total, 42.63MB (44705996) headers (space savings 82.07%), 27.58GB (29612952933) data
UDP datagram: 1344411 sent, 22334836 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      730us    112.84ms      5.18ms    15.55ms    64.97ms     7.95ms      9.03ms    95.24%
connect     :     1.82ms     10.18ms      3.10ms     8.63ms    10.18ms     3.79ms      1.96ms    84.85%
TTFB        :     2.96ms     18.84ms      6.55ms    17.89ms    18.84ms     7.81ms      4.19ms    69.70%
req/s       :       0.00    21792.37     4501.74   21272.59   21792.37    5689.27     7279.23    85.94%
min RTT     :        0us       113us        33us       93us      113us       34us        36us    79.69%
smoothed RTT:      135us    333.00ms       292us   333.00ms   333.00ms   161.41ms    167.63ms    51.56%
packets sent:          4       58194       23193      57742      58194   21007.45    22478.77    75.00%
packets recv:          0     1333756      278108    1302029    1333756  348982.84   445655.21    85.94%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1          45           6         33         34       9.07        8.79    88.90%
[info] CPU 1909.2% | Mem 718MiB

[run 3/3]
starting benchmark...
11.
7Main benchmark duration is started for thread #19.
.
.
54.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3
. Stopping all clients.
10. Stopping all clients.

. Stopping all clients.Main benchmark duration is over for thread #

30. Stopping all clients.
53
57. Stopping all clients.
62. Stopping all clients.Main benchmark duration is over for thread #21. Stopping all clients.

60

finished in 5.01s, 115701.20 req/s, 1.76GB/s
requests: 578506 total, 579082 started, 578506 done, 578506 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 578603 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 8.78GB (9428040841) total, 13.55MB (14204897) headers (space savings 82.07%), 8.76GB (9410082323) data
UDP datagram: 400154 sent, 7093208 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      716us     68.84ms      4.64ms    12.86ms    59.97ms     7.48ms      8.85ms    96.64%
connect     :     2.24ms      7.53ms      2.92ms     7.53ms     7.53ms     3.67ms      1.95ms    77.78%
TTFB        :     3.31ms     17.51ms      4.86ms    17.51ms    17.51ms     7.14ms      4.85ms    77.78%
req/s       :       0.00    24161.73        0.00   10974.82   24161.73    1807.77     5475.81    92.19%
min RTT     :        0us       117us         0us       72us      117us        9us        26us    90.63%
smoothed RTT:      157us    333.00ms    333.00ms   333.00ms   333.00ms   286.20ms    116.60ms    85.94%
packets sent:          4       63464           4      48532      63464    6252.69    16595.73    85.94%
packets recv:          0     1478113           0     672968    1478113  110831.66   335199.47    92.19%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1          45           6         33         34       9.07        8.80    88.89%
[info] CPU 526.1% | Mem 724MiB

=== Best: 545670 req/s (CPU: 4531.5%, Mem: 658MiB) ===
[info] saved results/static-h3/64/true-async-server.json
httparena-bench-true-async-server
httparena-bench-true-async-server
[info] skip: true-async-server does not subscribe to gateway-64
[info] skip: true-async-server does not subscribe to gateway-h3
[info] skip: true-async-server does not subscribe to production-stack
[info] skip: true-async-server does not subscribe to unary-grpc
[info] skip: true-async-server does not subscribe to unary-grpc-tls
[info] skip: true-async-server does not subscribe to stream-grpc
[info] skip: true-async-server does not subscribe to stream-grpc-tls
[info] skip: true-async-server does not subscribe to echo-ws
[info] skip: true-async-server does not subscribe to echo-ws-pipeline
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-16-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-4-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/async-db-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2c-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2c-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2c-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h3-64.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/fortunes-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-16384.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-h2c-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-h2c-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-tls-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-6800.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h2-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h2-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h3-64.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-32.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
[info] restoring loopback MTU to 65536
[info] restoring CPU governor → powersave

@MDA2AV MDA2AV merged commit d73ef9b into MDA2AV:main Jun 1, 2026
7 of 8 checks passed
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