Liking cljdoc? Tell your friends :D

Raw per-step capacity tables — 2026-08-29/30 campaign

Backing data for the summary in ../soak-results.md (procedure: ../../soak/README.md) and for grpc/grpc-java#13012. Setup: talos-main (arm64), identical 1-CPU/1-Gi Guaranteed pods, one arm per 4-core worker, sequential runs, k6 ramping-arrival-rate 200→2400 req/s in 2-minute steps (10 s climb + 110 s hold), tiny unary echo, warm JVM client on its own worker. Each row: the step's 110 s hold window. grpc-java 1.83.1, non-shaded Netty 4.2.16.Final, Clojure 1.12.5 via clj-grpc 0.1.4.

Known artifacts, disclosed: the first step of every JVM-based run is JIT warmup (the arm rolls immediately before its run). Run 1's arm was liveness-killed at ~00:06:41Z and again near ramp top (probes later relaxed to failureThreshold 60). Run 3's arm was liveness-killed at ~00:56Z. Run 5's 1400-offered window shows a transient inversion (dropped-iterations spike that window) inconsistent with its neighbors.

Summary

Capacity ramps (200→2400 req/s, 2-min steps, one arm at a time, same pods): max sustainable goodput per identical 1-CPU pod —

configurationplateauoverload behavior
gRPC JVM :direct~2,140 req/sgraceful (h2 flow-control backpressure)
gRPC JVM VT default~2,060 req/sgraceful, tails degrade
gRPC native VT~1,550 req/sliveness-starvation kills before probe tuning
REST (Jetty, HTTP/1.1)~960 req/squeue-death: p50 pins at 1.7 s, then collapse

At equal resources gRPC sustains 2.2× (JVM) / 1.6× (native) REST's throughput. The executor trade inverts with load: VT protects tails ~2× at ~10% utilization; above ~75% utilization :direct wins goodput and tails (p99 382 vs 662 ms at 2000 req/s). Peak heaps under saturation: native 81 MB, gRPC-JVM 61 MB, REST 267 MB.

A grpc-netty patch adding a server-side WriteQueue.drainNow() (upstream prototype) reproduced its JMH signature on-cluster: p99 −20–23% across 1200–2200 req/s and −64% at 2400 (1994→717 ms), goodput unchanged.

Run 1 — grpc-native, VT executor (start 23:49:12Z)

offereddeliveredp50msp99msdropped/s
200200.32.69.10
400400.52.713.10
600600.02.923.70
800800.83.848.90
1000999.511.081.30.3
12001197.630.9187.82.8
14001379.382.3457.720.8
16001499.7426.02226.491.9
18001580.6760.32455.1187.6
20001567.6832.92465.4432.4
22001607.7823.32459.5598.8
24001524.8840.12496.5818.0

Run 2 — grpc-jvm, VT executor (start 00:13:46Z)

offereddeliveredp50msp99msdropped/s
200207.63.94326.10.0
400400.22.812.80.0
600600.23.024.90.0
800800.43.344.50.0
10001000.63.959.50.0
12001201.84.986.80.0
14001393.010.7827.96.9
16001600.716.0238.70.0
18001791.734.9324.90.0
20001991.969.2661.810.8
22002059.3126.6972.5132.4
24001984.3254.62069.8339.7

Run 3 — rest (Pedestal/Jetty 12, HTTP/1.1, platform pool) (start 00:38:20Z)

offereddeliveredp50msp99msdropped/s
200201.9207.110000.03.8
400396.82692.37685.49.5
600601.44.6239.90.0
800799.99.195.50.0
1000962.51634.62486.230.0
1200960.71697.22487.9239.1
1400959.11700.32488.8441.0
1600958.31696.72488.3642.1
1800957.11689.72490.3843.1
200043.20.09696.51942.6
2200244.66572.010000.01954.6
2400348.15500.67460.21995.7

Run 4 — grpc-jvm, directExecutor (start 01:04:21Z)

offereddeliveredp50msp99msdropped/s
200206.63.14448.40.0
400400.42.69.60.0
600599.52.821.10.0
800800.33.038.30.0
10001000.23.450.40.0
12001200.74.086.60.0
14001403.14.9113.00.0
16001602.39.4222.50.0
18001797.517.1289.33.7
20001991.032.4381.94.0
22002137.460.3649.778.0
24001978.894.41993.9340.7

Run 5 — grpc-jvm, directExecutor + drainNow patch (start 01:29:48Z)

grpc-netty classes replaced with the wedge/server-drain-now-1.83.1 build (v1.83.1 + server-side WriteQueue.drainNow() in NettyServerHandler.channelReadComplete); everything else identical to run 4, same node.

offereddeliveredp50msp99msdropped/s
200203.92.92125.20.0
400400.32.69.60.0
600600.62.718.40.0
800799.92.932.40.0
10001000.83.449.00.0
12001196.34.066.60.0
14001397.75.6260.11.1
16001594.610.1222.05.4
18001796.020.3230.71.0
20001986.643.5391.66.5
22002116.475.5498.177.4
24002013.4104.5717.1318.1

Heap (per-minute /metrics sampling across runs 1–4)

armidlepeak under saturation
grpc-native6 MB81 MB
grpc-jvm11 MB61 MB
rest30 MB267 MB

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
Move to previous article
Move to next article
Ctrl+/Jump to the search field
× close