WorkManager pipeline benchmarks
These measure the real path a worker sees: a publisher sends CloudEvents to a
topic, the API fans them out (Redis/Dapr), the Runtime enqueues them and calls
the worker's actor turn, the worker returns a marker event, and a subscriber
receives it. The worker is the same no-op marker used on the engine page, so
anything measured here is the pipeline, not the worker's business logic.
Fixed rate
The publisher offers a known rate (for example 50 events/s) for a fixed
window. This shows whether the pipeline keeps up at that load and how long an
event takes end to end:
- events/s — markers received ÷ window; below the offered rate means
the pipeline fell behind;
- p50/p95/p99 — publish → marker receive, including queueing at every
hop; a p99 far above p50 is backlog building up;
- delivered/offered — loss or timeout (dead letters are counted as
errors, not delivered).
| engine | events/s | vs median | p50 ms | p95 ms | p99 ms | delivered/offered | history (events/s) | status |
| text/x-csharp | 30.30 | — | 189.54 | 966.22 | 1113.64 | 303/303 | | ok |
| text/x-python | 50.00 | — | 20.79 | 54.56 | 109.33 | 500/500 | | ok |
| text/x-typescript | 46.80 | — | 33.27 | 382.44 | 490.38 | 468/468 | | ok |
Saturation
The publisher sends a batch of events as fast as it can (batched
PublishEvents calls) and waits for all markers. This is the
pipeline's ceiling for this deployment:
- events/s — delivered ÷ (publish time + drain time);
- publish s / drain s — how much of the window was the publisher
versus the workers draining the backlog;
- errors — events still undelivered at the drain deadline.
| engine | events/s | vs median | delivered | offered | errors | publish s | drain s | history (events/s) | status |
| text/x-csharp | 9.90 | — | 1402 | 2000 | 598 | 21.6 | 120.0 | | ok |
| text/x-python | 123.42 | — | 2000 | 2000 | 0 | 16.2 | 0.1 | | ok |
| text/x-typescript | 14.65 | — | 1998 | 2000 | 2 | 16.4 | 120.0 | | ok |
The pipeline currently runs against the dedicated
virtufin-benchmark namespace (api/workmanager/runtime, one replica
each). Its replica count and Redis bound the result; that is the point of an
isolated baseline, and the numbers are not comparable with the engine page.
History
text/x-csharp — fixed rate
| date | events/s | p50 ms | p99 ms | delivered/offered | errors |
| 2026-11-11T03:35:58 | 30.30 | 189.54 | 1113.64 | 303/303 | 0 |
text/x-python — fixed rate
| date | events/s | p50 ms | p99 ms | delivered/offered | errors |
| 2026-11-11T03:36:28 | 50.00 | 20.79 | 109.33 | 500/500 | 0 |
text/x-typescript — fixed rate
| date | events/s | p50 ms | p99 ms | delivered/offered | errors |
| 2026-11-11T03:38:59 | 46.80 | 33.27 | 490.38 | 468/468 | 0 |