Stress tests
Kevlar and Polly v8 run the same composed timeout, retry, and circuit-breaker workload under sustained parallel load. Alternating measurement rounds run in a single process, so they use the same GitHub runner while balancing early- and late-run conditions.
Last updated 2026-09-10 13:02 UTC (commit dda402f).
note
Shared CI runners vary. Treat one run as a sustained-load health check, not a universal capacity claim. Compare ratios and allocation behavior, then measure your own workload.
Latest result
| Scenario | Workers | Library | Throughput | CPU | Allocated | Allocated/op | GC pause | GC collections (0 / 1 / 2) | Process lock contentions |
|---|---|---|---|---|---|---|---|---|---|
| Shared timeout → retry → ratio breaker | 1 | Kevlar | 2.46M ops/s | 100% | 8.15 KiB | 0.00 B | 0.00 ms | 0 / 0 / 0 | 1 |
| Shared timeout → retry → ratio breaker | 1 | Polly | 1.37M ops/s | 100% | 6.90 GiB | 48.00 B | 118.73 ms | 441 / 8 / 0 | 1 |
| Shared timeout → retry → ratio breaker | 4 | Kevlar | 3.46M ops/s | 398% | 11.10 KiB | 0.00 B | 0.00 ms | 0 / 0 / 0 | 3.22K |
| Shared timeout → retry → ratio breaker | 4 | Polly | 2.68M ops/s | 396% | 13.50 GiB | 48.00 B | 295.85 ms | 867 / 8 / 0 | 3.94K |
| Shared timeout → retry | 4 | Kevlar | 3.19M ops/s | 398% | 10.62 KiB | 0.00 B | 0.00 ms | 0 / 0 / 0 | 21.99K |
| Shared timeout → retry | 4 | Polly | 3.68M ops/s | 398% | 9.26 GiB | 24.00 B | 211.91 ms | 595 / 8 / 0 | 1.51K |
| Per-worker timeout → retry → ratio breaker | 4 | Kevlar | 3.44M ops/s | 398% | 14.89 KiB | 0.00 B | 0.00 ms | 0 / 0 / 0 | 3.24K |
| Per-worker timeout → retry → ratio breaker | 4 | Polly | 2.74M ops/s | 398% | 13.80 GiB | 48.00 B | 335.81 ms | 886 / 8 / 0 | 1.10K |
Comparisons
| Scenario | Workers | Kevlar / Polly throughput |
|---|---|---|
| Shared timeout → retry → ratio breaker | 1 | 1.79× |
| Shared timeout → retry → ratio breaker | 4 | 1.29× |
| Shared timeout → retry | 4 | 0.86× |
| Per-worker timeout → retry → ratio breaker | 4 | 1.25× |
Method
- 1 and 4 parallel workers; 15 minutes total measured time, split equally between scenarios and libraries across 4 alternating rounds.
- Each scenario and library warmed for 2 seconds before measurement.
- Shared and per-worker ratio-breaker scenarios run Timeout(10 s) → Retry(3, no delay) → CircuitBreaker(10% over 30 s, min 100, break 5 s).
- Timeout/retry isolates pipeline overhead from circuit-breaker shared-state contention.
- Process-wide CPU, allocation, GC pause, collection, and managed-lock contention counters are captured separately for each phase.
- Peak working set for the shared process: 77.27 MiB.
Environment
- Ubuntu 24.04.5 LTS
- .NET 10.0.12
- 4 logical processors visible to .NET
Reproduce
dotnet run -c Release --project benchmarks/Kevlar.StressTests -- --duration 00:15:00
Use --workers, --warmup, and --output to override the defaults. The stress workflow runs weekly and republishes this page.