Skip to content

vertx: the seven profiles it was missing - #1249

Open
MDA2AV wants to merge 2 commits into
mainfrom
feat/vertx-missing-profiles
Open

vertx: the seven profiles it was missing#1249
MDA2AV wants to merge 2 commits into
mainfrom
feat/vertx-missing-profiles

Conversation

@MDA2AV

@MDA2AV MDA2AV commented Aug 21, 2026

Copy link
Copy Markdown
Owner

static, static-tls, json-tls, async-db, crud, api-4 and api-16.
Tests go from 6 to 13.

The entry carried four endpoints — /pipeline, /baseline11, /json/:count,
/upload. api-4 and api-16 rotate over /baseline11, /json and
/async-db, so wiring Postgres brings all three profiles with it.

json-tls / static-tls

The verticle is already deployed once per core, so each instance binds both ports
and the TLS listener is spread across every event loop rather than parked on one
— the failure #1245 fixed on quarkus. ALPN is off: those two profiles want
HTTP/1.1 negotiated and no h2 offered.

Postgres

The reactive pg client, one pool per verticle instance so the harness's
connection budget is split across them rather than opened by each. postgres:18
negotiates SCRAM-SHA-256, which the client leaves to com.ongres.scram.

Worth recording: tags is a JSONB column, so the client hands back a
JsonArray rather than text. Reading it as a String threw inside the success
handler, which left async-db and crud answering with an empty body and no
content type — the first validation run failed all eight of their checks that
way while fortunes still rendered 202 rows, since it only reads id and
message.

static

Bodies are read from disk on every request — sendFile hands the descriptor to
the kernel rather than holding the bytes — and the pre-compressed .br/.gz
sibling is picked per request, also from disk.

crud

Cache-aside on the vertx redis client, 200ms TTL, explicit delete on update.

Validation

58 passed, 0 failed.

fortunes is deliberately not included.

🤖 Generated with Claude Code

static, static-tls, json-tls, async-db, crud, api-4 and api-16. The entry carried
four endpoints; api-4 and api-16 rotate over /baseline11, /json and /async-db, so
wiring Postgres brings all three profiles with it.

json-tls and static-tls listen on 8081. The verticle is already deployed once per
core, so having each instance bind both ports spreads the TLS listener across
every event loop rather than parking it on one - the failure #1245 fixed on
quarkus. ALPN is off: those two profiles want HTTP/1.1 and no h2 offered.

Postgres goes through the reactive pg client, one pool per verticle instance so
the harness's connection budget is split across them. postgres:18 negotiates
SCRAM-SHA-256, which the client leaves to com.ongres.scram.

tags is a JSONB column, so the client hands back a JsonArray rather than text -
reading it as a String threw and left async-db and crud answering with an empty
body and no content type.

Static file bodies are read from disk on every request; sendFile hands the
descriptor to the kernel and the pre-compressed sibling is picked per request.

crud runs cache-aside on Redis through the vertx redis client, with a 200ms TTL
and an explicit delete on update.

Validation: 58 passed, 0 failed.
@MDA2AV

MDA2AV commented Aug 21, 2026

Copy link
Copy Markdown
Owner Author

/benchmark --save

@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: vertx | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 2,042,479 6487.6% 2.8GiB -1.4% -15.2%
baseline 4096 1,994,369 6290.9% 4.8GiB -3.2% +6.7%
pipelined 512 12,414,412 6192.5% 5.2GiB +8.7% -8.8%
pipelined 4096 11,782,768 6288.8% 7.3GiB +5.1% +17.7%
limited-conn 512 583,157 3191.5% 2.4GiB -2.9% ~0%
limited-conn 4096 602,586 3254.6% 2.4GiB -0.5% +4.3%
json 4096 671,315 6382.1% 6.6GiB -2.5% -42.1%
json-comp 512 257,543 6182.5% 4.1GiB -0.9% ~0%
json-comp 4096 256,544 6095.9% 6.4GiB -1.0% -4.5%
json-comp 16384 256,570 6181.9% 15.2GiB -0.1% +18.7%
json-tls 4096 601,618 6181.7% 8.0GiB NEW NEW
upload 32 1,846 2664.8% 7.8GiB -12.3% ~0%
upload 256 2,148 6072.8% 9.7GiB +5.9% +9.0%
api-4 256 29,786 396.3% 618MiB NEW NEW
api-16 1024 104,880 1580.4% 2.0GiB NEW NEW
static 1024 230,227 6447.1% 2.8GiB NEW NEW
static 4096 227,767 6441.7% 3.1GiB NEW NEW
static 6800 226,617 6321.8% 3.2GiB NEW NEW
static-tls 1024 195,103 6204.9% 1.6GiB NEW NEW
static-tls 4096 191,689 6313.9% 3.4GiB NEW NEW
static-tls 6800 187,031 6282.1% 2.8GiB NEW NEW
async-db 1024 198,525 4772.4% 5.1GiB NEW NEW
crud 4096 226,986 4087.6% 2.9GiB NEW NEW
Full log
[info] server ready

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.13ms   2.69ms   10.80ms   33.40ms   116.20ms

  1862133 requests in 10.00s, 1862136 responses
  Throughput: 186.17K req/s
  Bandwidth:  703.90MB/s
  Status codes: 2xx=1862136, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1862136 / 1862136 responses (100.0%)
  Reconnects: 73997
  Per-template: 371098,372506,373682,373239,371611
  Per-template-ok: 371098,372506,373682,373239,371611
[info] CPU 4985.8% | Mem 5.1GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.72ms   1.30ms   10.50ms   47.00ms   52.60ms

  1985249 requests in 10.00s, 1985254 responses
  Throughput: 198.48K req/s
  Bandwidth:  750.36MB/s
  Status codes: 2xx=1985254, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1985245 / 1985254 responses (100.0%)
  Reconnects: 79391
  Per-template: 396428,397098,397621,397487,396611
  Per-template-ok: 396428,397098,397621,397487,396611
[info] CPU 4772.4% | Mem 5.1GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.91ms   1.12ms   14.40ms   56.90ms   75.20ms

  1917075 requests in 10.00s, 1917076 responses
  Throughput: 191.66K req/s
  Bandwidth:  724.77MB/s
  Status codes: 2xx=1917076, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1917073 / 1917076 responses (100.0%)
  Reconnects: 76652
  Per-template: 382261,383455,384344,384118,382895
  Per-template-ok: 382261,383455,384344,384118,382895
[info] CPU 4639.4% | Mem 5.1GiB

=== Best: 198525 req/s (CPU: 4772.4%, Mem: 5.1GiB) ===
[info] input BW: 13.25MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/vertx.json
httparena-bench-vertx
httparena-bench-vertx

==============================================
=== vertx / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   19.93ms   14.40ms   43.00ms   70.90ms   406.50ms

  3081064 requests in 15.00s, 3077160 responses
  Throughput: 205.11K req/s
  Bandwidth:  58.29MB/s
  Status codes: 2xx=3077160, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3077160 / 3077160 responses (100.0%)
  Reconnects: 13396
  Per-template: 185001,182116,171445,158379,146876,142096,142635,143881,144610,143660,145435,145469,143390,143881,143226,143114,151422,158711,167485,174328
  Per-template-ok: 185001,182116,171445,158379,146876,142096,142635,143881,144610,143660,145435,145469,143390,143881,143226,143114,151422,158711,167485,174328
[info] CPU 4011.0% | Mem 2.9GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   18.17ms   14.80ms   36.70ms   60.30ms   75.40ms

  3379704 requests in 15.00s, 3379705 responses
  Throughput: 225.28K req/s
  Bandwidth:  63.79MB/s
  Status codes: 2xx=3379705, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3379698 / 3379705 responses (100.0%)
  Reconnects: 14936
  Per-template: 196708,196398,189882,177745,163751,161173,158534,158928,158234,158617,161146,160614,160912,160600,158409,159999,162610,170971,177721,186746
  Per-template-ok: 196708,196398,189882,177745,163751,161173,158534,158928,158234,158617,161146,160614,160912,160600,158409,159999,162610,170971,177721,186746
[info] CPU 4086.1% | Mem 2.9GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   18.03ms   13.80ms   39.80ms   62.80ms   84.40ms

  3404996 requests in 15.00s, 3404796 responses
  Throughput: 226.95K req/s
  Bandwidth:  64.18MB/s
  Status codes: 2xx=3404796, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3404792 / 3404796 responses (100.0%)
  Reconnects: 15028
  Per-template: 201581,202111,189996,178867,165132,159815,159499,159447,158079,160091,160269,158475,160109,158947,161143,160508,163770,172861,182548,191544
  Per-template-ok: 201581,202111,189996,178867,165132,159815,159499,159447,158079,160091,160269,158475,160109,158947,161143,160508,163770,172861,182548,191544
[info] CPU 4087.6% | Mem 2.9GiB

=== Best: 226986 req/s (CPU: 4087.6%, Mem: 2.9GiB) ===
[info] input BW: 19.48MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/vertx.json
httparena-bench-vertx
httparena-bench-vertx
[info] skip: vertx does not subscribe to fortunes
[info] skip: vertx does not subscribe to baseline-h2
[info] skip: vertx does not subscribe to static-h2
[info] skip: vertx does not subscribe to baseline-h2c
[info] skip: vertx does not subscribe to json-h2c
[info] skip: vertx does not subscribe to baseline-h3
[info] skip: vertx does not subscribe to static-h3
[info] skip: vertx does not subscribe to gateway-64
[info] skip: vertx does not subscribe to gateway-h3
[info] skip: vertx does not subscribe to production-stack
[info] skip: vertx does not subscribe to unary-grpc
[info] skip: vertx does not subscribe to unary-grpc-tls
[info] skip: vertx does not subscribe to stream-grpc
[info] skip: vertx does not subscribe to stream-grpc-tls
[info] skip: vertx does not subscribe to echo-ws
[info] skip: vertx does not subscribe to echo-ws-pipeline
[info] skip: vertx does not subscribe to echo-ws-limited
[info] rebuilding site/data/*.json
[purged stale] zix-grpc.json (zix-grpc)
[purged stale] zix-ws.json (zix-ws)
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/vertx.json - 23 new, 23 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[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.

1 participant