Benchmark Results

Local Benchmark Comparison

Local provider comparisons (stress/load + Criterion) on one host.

Local backend performance (comparison)

Results from make stress-local-compare.

Environment + machine details for interpreting results: see Benchmarking & Load Testing (Results).

All runs used:

  • --provider local --threads 16 --duration-s 30 --window-s 10
  • sample_every=100
  • trypema commit: b4bd2459217fe65b2f38fe423e6ff5bb5cfe8657 (chore: refactor benches)

Note: make stress-local-compare runs both trypema strategy variants (local + absolute and local + suppressed).

Hot key (enforced limit)

Workload:

  • --key-dist hot --rate-limit-per-s 1000
  • --key-dist hot: always uses a single key (user_0); key_space is ignored (effectively 1 key).
Backendops/sp50 (us)p95 (us)p99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (SlidingWindowLog, absolute)387,81982044429256,98330,00011,606,906000
governor (GCRA, absolute)3,883,509152512015,68740,000116,484,081000
trypema (local + absolute)3,488,403153313219,15130,014104,631,741000
trypema (local + suppressed)3,650,5741397489,27930,76505,003109,485,6490

Uniform keys (100k keys, effectively unlimited)

Workload:

  • --key-dist uniform --key-space 100000 --rate-limit-per-s 1000000000
  • --key-dist uniform: picks a key uniformly at random from key_space keys (user_0..user_{key_space-1}).
Backendops/sp50 (us)p95 (us)p99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (SlidingWindowLog, absolute)66,825659231,5274,60796,2552,009,6810000
governor (GCRA, absolute)6,280,022111113,295188,583,9230000
trypema (local + absolute)9,641,27611221510,023289,569,2270000
trypema (local + suppressed)7,609,67712421376,287228,537,4500000

For more comprehensive uniform key results across varying key spaces and rate limits, see Local uniform keys (matrix) below.

Results (Stress / Load harness)

These results are copied from a make stress run (the trypema-stress harness). Units:

  • Throughput: ops_per_s (ops/sec)
  • Latency: lat_us in microseconds (sampled every sample_every=100 ops)

key_dist controls how the stress test chooses rate-limiter keys (users) on each operation:

  • hot: always uses a single key (user_0). key_space is ignored (effectively 1 key).
  • uniform: picks a key uniformly at random from key_space keys (user_0..user_{key_space-1}).
  • skewed: with probability hot_fraction uses user_0, otherwise picks uniformly from the remaining keys (user_1..). (key_space controls how many exist.)
TargetBackendModeThreadsDuration (s)Key distKey spaceOffered loadops/sp50 (us)p95 (us)p99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_deniederrors
make stress-local-hottrypema (local + absolute)max1630hot100000max3,581,224153010724,23930,014107,419,45500
make stress-local-uniformtrypema (local + absolute)max1660uniform100000max8,354,3041151451,470501,590,138000
make stress-local-bursttrypema (local + suppressed)target-qps16120skewed100000target=20k, burst=200k683,74016234849,03116,625,173065,450,3860

Local uniform keys (matrix)

These runs come from make stress-local-uniform-matrix (stress harness) and vary key_space and rate_limit_per_s while keeping the rest fixed:

  • --threads 16 --duration-s 30 --window-s 10 --group-ms 10 --mode max --key-dist uniform

The harness prints results in run groups of four (one per limiter variant). To keep it readable, the matrix is split by (key_space, rate_limit_per_s).

key_space=10, rate_limit_per_s=1

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,462,8211011972,05730043,891,804000
governor (absolute)11,539,2821122,671400346,240,036000
trypema (local + absolute)11,444,1621119,039309343,337,760000
trypema (local + suppressed)9,693,2841326,6711,020044290,851,9870

key_space=10, rate_limit_per_s=10

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,489,69710222012,3113,00044,699,153000
governor (absolute)11,565,9901117,0074,000347,044,913000
trypema (local + absolute)11,509,8561116,1753,004345,350,593000
trypema (local + suppressed)8,850,8851927,0233,9520495265,534,7120

key_space=10, rate_limit_per_s=100

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,491,9441002071,72930,00044,743,976000
governor (absolute)11,404,4191123,51940,000342,157,543000
trypema (local + absolute)11,387,0561220,12730,011341,646,817000
trypema (local + suppressed)8,996,5261824,68738,95304,996269,873,7510

key_space=10, rate_limit_per_s=10,000

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,478,0591012142,8973,000,00041,352,200000
governor (absolute)11,374,1291115,2874,000,010337,289,423000
trypema (local + absolute)11,496,4261130,0793,000,012341,955,743000
trypema (local + suppressed)8,639,02611022,8633,000,893087,211256,119,5750

key_space=10, rate_limit_per_s=100,000

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,461,87010019298130,000,00013,867,219000
governor (absolute)11,230,7051123,07140,000,075296,935,126000
trypema (local + absolute)11,122,1161323,35930,000,013303,687,477000
trypema (local + suppressed)8,639,49911035,29530,000,7930547,347228,677,4710

key_space=1,000, rate_limit_per_s=1

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,469,712731,19914,58330,00744,074,915000
governor (absolute)6,261,2211120,46339,220187,830,595000
trypema (local + absolute)6,510,1311113,59130,007195,310,397000
trypema (local + suppressed)6,254,48415216,86334,58303,999187,616,5420

key_space=1,000, rate_limit_per_s=10

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,480,674711,13319,935300,00844,132,533000
governor (absolute)11,380,1361121,519399,199341,077,110000
trypema (local + absolute)11,923,1621120,719300,013357,471,864000
trypema (local + suppressed)9,637,79012611,999319,895049,000288,779,4830

key_space=1,000, rate_limit_per_s=100

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,456,029811,15916,6393,000,00840,695,894000
governor (absolute)6,259,9111114,3113,999,244183,826,239000
trypema (local + absolute)11,931,0781124,8953,000,019355,000,796000
trypema (local + suppressed)6,269,13416911,0952,999,759062,035185,026,2360

key_space=1,000, rate_limit_per_s=10,000

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,520,512711,06616,34345,631,2490000
governor (absolute)6,258,4291110,087187,771,8340000
trypema (local + absolute)11,175,8041111,743300,000,01835,324,813000
trypema (local + suppressed)10,165,15311315,063213,629,662089,715,6971,671,0190

key_space=1,000, rate_limit_per_s=100,000

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,436,225731,16731,67943,094,6500000
governor (absolute)6,306,8211119,023189,232,2990000
trypema (local + absolute)6,411,4871621,119192,376,6620000
trypema (local + suppressed)10,078,77411314,207302,399,6960000

key_space=10,000, rate_limit_per_s=1

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,000,018342,10919,903300,02029,714,952000
governor (absolute)11,508,7731134,879390,007344,961,238000
trypema (local + absolute)11,832,5811121,375300,020354,794,617000
trypema (local + suppressed)8,984,41522248,295277,835039,903269,296,7890

key_space=10,000, rate_limit_per_s=10

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)992,127362,10723,3273,000,01926,775,548000
governor (absolute)6,362,2681124,1913,990,008186,927,711000
trypema (local + absolute)6,509,8601126,1913,000,026192,360,589000
trypema (local + suppressed)8,689,74122063,5052,973,493083,118257,693,3510

key_space=10,000, rate_limit_per_s=100

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)997,518331,90217,29528,348,4471,588,838000
governor (absolute)11,452,8471130,17539,989,991303,689,537000
trypema (local + absolute)11,784,1031123,83930,000,028323,564,650000
trypema (local + suppressed)8,786,16622588,37529,970,0360563,427233,103,3670

key_space=10,000, rate_limit_per_s=10,000

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)1,053,736232,04436,19131,621,6720000
governor (absolute)11,319,0921110,527339,629,1090000
trypema (local + absolute)11,152,9811128,391334,715,7390000
trypema (local + suppressed)9,949,94812069,703298,589,7480000

key_space=10,000, rate_limit_per_s=100,000

Limiterops/sp99 (us)p99.9 (us)max (us)allowedrejectedsuppressed_allowedsuppressed_deniederrors
burster (absolute)997,546362,36922,35129,935,8250000
governor (absolute)11,123,1701123,775333,740,8320000
trypema (local + absolute)10,987,3231179,591329,685,2810000
trypema (local + suppressed)9,600,00912176,875288,083,5370000