Skip to content

Commit 373c8cc

Browse files
chore(charts): regenerate from results [skip ci]
1 parent f3abd5c commit 373c8cc

27 files changed

Lines changed: 40 additions & 34 deletions

‎results/added_latency.png‎

31.5 KB
Loading

‎results/cost_per_million.png‎

40.9 KB
Loading

‎results/frontier_climb.png‎

112 KB
Loading

‎results/frontier_rps_at_bound.png‎

57.6 KB
Loading

‎results/frontier_shape.png‎

33.1 KB
Loading

‎results/frontier_shapes_key.png‎

-355 Bytes
Loading

‎results/memory_recovery.png‎

79.7 KB
Loading

‎results/memory_rss.png‎

77 KB
Loading

‎results/reports/all/README.md‎

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@ Every number below is regenerated from the raw `results/*.json` - re-run `run-al
88
|---|--:|--:|--:|--:|---|
99
| [LiteLLM · Rust](https://github.com/BerriAI/litellm) | 105 µs | 44,382 <sub>(+1% from 1 ms to no bound)</sub> | - | - | `litellm-ai-gateway` |
1010
| [agentgateway](https://github.com/agentgateway/agentgateway) | 229 µs | 25,041 <sub>(+6% from 1 ms to no bound)</sub> | 25 MiB | 47 MiB | `ghcr.io/agentgateway/agentgateway:v1.4.0` |
11+
| [AISIX (api7)](https://github.com/api7/aisix) | 279 µs | 17,428 <sub>(+4% from 1 ms to no bound)</sub> | 67 MiB | 350 MiB | `target/release/aisix` |
1112
| [Helicone](https://github.com/Helicone/ai-gateway) | 322 µs | 14,826 <sub>(+6% from 1 ms to no bound)</sub> | 43 MiB | 56 MiB | `target/release/ai-gateway` |
1213
| [Kong](https://github.com/Kong/kong) | 389 µs | 21,867 <sub>(+63% from 1 ms to no bound)</sub> | 382 MiB | 595 MiB | `kong:3.9.3` |
1314
| [APISIX](https://github.com/apache/apisix) | 446 µs | 20,229 <sub>(+74% from 1 ms to no bound)</sub> | 180 MiB | 211 MiB | `apache/apisix:3.17.0-debian` |
1415
| [Bifrost](https://github.com/maximhq/bifrost) | 900 µs | 5,198 <sub>(+225% from 1 ms to no bound)</sub> | 235 MiB | 815 MiB | `maximhq/bifrost:v1.6.6` |
16+
| [GoModel](https://github.com/ENTERPILOT/GOModel) | 2,020 µs | 1,828 <sub>(+52% from 5 ms to no bound)</sub> | 51 MiB | 86 MiB | `enterpilot/gomodel:0.1.63` |
1517
| [TensorZero](https://github.com/tensorzero/tensorzero) | 40,990 µs | 0 | 49 MiB | 70 MiB | `tensorzero/gateway:2026.6.0` |
1618
| [Plano](https://github.com/katanemo/plano) | 201,977 µs | 0 | 614 MiB | 968 MiB | `katanemo/plano:0.4.29` |
1719
| [One-API](https://github.com/songquanpeng/one-api) | 1,230,281 µs | 0 | 86 MiB | 144 MiB | `justsong/one-api:v0.6.10` |
18-
| [AISIX (api7)](https://github.com/api7/aisix) | ⏳ *pending* | - | - | - | *pending measurement* |
1920
| [Busbar](https://github.com/GetBusbar/busbar) | ⏳ *pending* | - | - | - | *pending measurement* |
20-
| [GoModel](https://github.com/ENTERPILOT/GOModel) | ⏳ *pending* | - | - | - | *pending measurement* |
2121
| [LiteLLM · Python](https://github.com/BerriAI/litellm) | ⏳ *pending* | - | - | - | *pending measurement* |
2222
| [Portkey](https://github.com/Portkey-AI/gateway) | ⏳ *pending* | - | - | - | *pending measurement* |
2323

24-
⏳ **Pending measurement** (a manifest exists; not yet run on the rig): AISIX (api7), Busbar, GoModel, LiteLLM · Python, Portkey. These land here as their runs complete - nothing is hidden.
24+
⏳ **Pending measurement** (a manifest exists; not yet run on the rig): Busbar, LiteLLM · Python, Portkey. These land here as their runs complete - nothing is hidden.
2525

2626
**Throughput is a curve, not a number.** The column above is one reading of each gateway's concurrency sweep: the most req/s it carried while 99% of requests finished under **10 ms** and it failed **none** it accepted. The same sweep is published at 5 tail-latency bounds (1 ms, 5 ms, 10 ms, 50 ms, 100 ms) plus with no bound at all, and the shape across them is the comparison that matters: a gateway already at its ceiling at 1 ms is a different machine from one that doubles when given 5 ms. See the frontier-shape chart. **≥** on a number means the sweep's top rung won, so that rate is a floor and no ceiling was established.
2727
**✕** = did not serve under load (0 successful req/s). &nbsp; **0** = came up, but no tested concurrency held p99 &lt; 10 ms while failing none of the requests it accepted. &nbsp; **⏳** = a manifest exists but it hasn't been run on the rig yet.
@@ -34,10 +34,12 @@ The most req/s each gateway carried while 99% of requests finished under the col
3434
|---|--:|--:|--:|--:|--:|--:|---|
3535
| [LiteLLM · Rust](https://github.com/BerriAI/litellm) | 43,818 | 44,382 | 44,382 | 44,382 | 44,382 | 44,382 | c=32, p99 1.11 ms, c=256 broke it |
3636
| [agentgateway](https://github.com/agentgateway/agentgateway) | 23,591 | 25,041 | 25,041 | 25,041 | 25,041 | 25,041 | c=32, p99 2 ms, c=256 broke it |
37+
| [AISIX (api7)](https://github.com/api7/aisix) | 16,828 | 17,428 | 17,428 | 17,428 | 17,428 | 17,428 | c=16, p99 1.43 ms, c=128 broke it |
3738
| [Helicone](https://github.com/Helicone/ai-gateway) | 14,007 | 14,768 | 14,826 | 14,826 | 14,826 | 14,826 | c=64, p99 7.03 ms, c=128 broke it |
3839
| [Kong](https://github.com/Kong/kong) | 13,539 | 21,283 | 21,867 | 22,033 | 22,033 | 22,033 | c=64, p99 9.84 ms, c=128 broke it |
3940
| [APISIX](https://github.com/apache/apisix) | 11,929 | 18,704 | 20,229 | 20,775 | 20,775 | 20,775 | c=64, p99 7.99 ms, c=128 broke it |
4041
| [Bifrost](https://github.com/maximhq/bifrost) | 1,812 | 4,883 | 5,198 | 5,198 | 5,198 | 5,883 | c=8, p99 5.07 ms, c=16 broke it |
42+
| [GoModel](https://github.com/ENTERPILOT/GOModel) | 0 | 1,746 | 1,828 | 2,654 | 2,656 | 2,656 | c=4, p99 5.83 ms, c=8 broke it |
4143
| [TensorZero](https://github.com/tensorzero/tensorzero) | 0 | 0 | 0 | 6,351 | 13,332 | 13,332 | - |
4244
| [Plano](https://github.com/katanemo/plano) | 0 | 0 | 0 | 0 | 0 | 21 | - |
4345
| [One-API](https://github.com/songquanpeng/one-api) | 0 | 0 | 0 | 35 | 35 | 36 | - |
@@ -52,10 +54,12 @@ Every rung of the same sweep the frontier readings above are taken from, summari
5254
|---|--:|--:|--:|--:|--:|--:|--:|
5355
| [LiteLLM · Rust](https://github.com/BerriAI/litellm) | 8,152 at c=1 | 44,377 at c=32 | 5.4× / 32× | c=16 | 139 µs → 4.97 s | none | c=32768 |
5456
| [agentgateway](https://github.com/agentgateway/agentgateway) | 4,571 at c=1 | 25,004 at c=32 | 5.5× / 32× | c=16 | 262 µs → 43.3 ms | c=1024 | c=1024 |
57+
| [AISIX (api7)](https://github.com/api7/aisix) | 4,278 at c=1 | 17,414 at c=16 | 4.1× / 16× | c=8 | 261 µs → 5.23 s | none | c=32768 |
5558
| [Helicone](https://github.com/Helicone/ai-gateway) | 3,253 at c=1 | 14,785 at c=64 | 4.5× / 64× | c=16 | 332 µs → 35.1 ms | c=128 | c=256 |
5659
| [Kong](https://github.com/Kong/kong) | 4,392 at c=1 | 21,936 at c=128 | 5.0× / 128× | c=16 | 430 µs → 114 ms | c=1024 | c=2048 |
5760
| [APISIX](https://github.com/apache/apisix) | 4,088 at c=1 | 20,754 at c=128 | 5.1× / 128× | c=64 | 461 µs → 153 ms | c=16384 | c=16384 |
5861
| [Bifrost](https://github.com/maximhq/bifrost) | 1,803 at c=1 | 5,803 at c=2048 | 3.2× / 2048× | c=1024 | 979 µs → 3.83 s | none | c=32768 |
62+
| [GoModel](https://github.com/ENTERPILOT/GOModel) | 1,356 at c=1 | 2,651 at c=128 | 2.0× / 128× | c=64 | 2.74 ms → 5.49 s | none | c=32768 |
5963
| [TensorZero](https://github.com/tensorzero/tensorzero) | 24 at c=1 | 13,747 at c=2048 | 572.8× / 2048× | c=1024 | 41 ms → 55 ms | c=1024 | c=2048 |
6064
| [Plano](https://github.com/katanemo/plano) | 4 at c=1 | 21 at c=8 | 5.2× / 8× | c=8 | 199 ms → 5.68 s | none | c=128 |
6165
| [One-API](https://github.com/songquanpeng/one-api) | 29 at c=1 | 40 at c=32 | 1.4× / 32× | c=32 | 42.4 ms → 3.26 s | c=4 | c=32 |
@@ -70,45 +74,47 @@ Same box, same mock, one gateway at a time. Streaming figures are the overhead t
7074
|---|--:|--:|--:|--:|
7175
| [LiteLLM · Rust](https://github.com/BerriAI/litellm) | 255 µs | 156 µs | ✕ not measured | n/a |
7276
| [agentgateway](https://github.com/agentgateway/agentgateway) | 381 µs | 5 µs | 501 (12,431 fps) | 22,688 (openai → anthropic) |
77+
| [AISIX (api7)](https://github.com/api7/aisix) | 521 µs | 26 µs | 2,799 (11,321 fps) | 16,301 (openai → anthropic) |
7378
| [Helicone](https://github.com/Helicone/ai-gateway) | 582 µs | ≤ rig resolution | 405 (19,136 fps) | 14,182 (openai → anthropic) |
7479
| [Kong](https://github.com/Kong/kong) | 106.4 ms | 168.7 ms | 856 (39,811 fps) | 20,032 (openai → anthropic) |
7580
| [APISIX](https://github.com/apache/apisix) | 11.3 ms | 9.1 ms | 13,942 (56,926 fps) | n/a |
7681
| [Bifrost](https://github.com/maximhq/bifrost) | 984 µs | ≤ rig resolution | 1,027 (40,468 fps) | 5,037 (openai → cohere) |
82+
| [GoModel](https://github.com/ENTERPILOT/GOModel) | 1.9 ms | ≤ rig resolution | 2,013 (60,430 fps) | 1,812 (openai → anthropic) |
7783
| [TensorZero](https://github.com/tensorzero/tensorzero) | 716 µs | 50 µs | 642 (9,251 fps) | 0 (openai → openai-responses) |
7884
| [Plano](https://github.com/katanemo/plano) | 169.2 ms | ≤ rig resolution | 81 (944 fps) | n/a |
7985
| [One-API](https://github.com/songquanpeng/one-api) | 797 µs | ≤ rig resolution | 213 (6,526 fps) | n/a |
8086

8187
**✕** cells are measured refusals, not gaps: the gateway was offered the load and could not do the thing (buffered instead of streaming, rejected the Anthropic shape, or has no native key/limit governance). **n/a** = that suite hasn't been run for this gateway yet.
8288

83-
![frontier_shape](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_shape.png?v=202607300658)
89+
![frontier_shape](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_shape.png?v=202607300729)
8490

85-
![frontier_shapes_key](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_shapes_key.png?v=202607300658)
91+
![frontier_shapes_key](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_shapes_key.png?v=202607300729)
8692

87-
![frontier_climb](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_climb.png?v=202607300658)
93+
![frontier_climb](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_climb.png?v=202607300729)
8894

89-
![added_latency](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/added_latency.png?v=202607300658)
95+
![added_latency](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/added_latency.png?v=202607300729)
9096

91-
![frontier_rps_at_bound](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_rps_at_bound.png?v=202607300658)
97+
![frontier_rps_at_bound](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/frontier_rps_at_bound.png?v=202607300729)
9298

93-
![memory_rss](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/memory_rss.png?v=202607300658)
99+
![memory_rss](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/memory_rss.png?v=202607300729)
94100

95-
![memory_recovery](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/memory_recovery.png?v=202607300658)
101+
![memory_recovery](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/memory_recovery.png?v=202607300729)
96102

97-
![rps_per_dollar](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/rps_per_dollar.png?v=202607300658)
103+
![rps_per_dollar](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/rps_per_dollar.png?v=202607300729)
98104

99-
![cost_per_million](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/cost_per_million.png?v=202607300658)
105+
![cost_per_million](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/cost_per_million.png?v=202607300729)
100106

101-
![stream_added_ttft](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/stream_added_ttft.png?v=202607300658)
107+
![stream_added_ttft](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/stream_added_ttft.png?v=202607300729)
102108

103-
![stream_added_gap](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/stream_added_gap.png?v=202607300658)
109+
![stream_added_gap](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/stream_added_gap.png?v=202607300729)
104110

105-
![stream_sustained](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/stream_sustained.png?v=202607300658)
111+
![stream_sustained](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/stream_sustained.png?v=202607300729)
106112

107-
![xlate_frontier_rps_at_bound](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/xlate_frontier_rps_at_bound.png?v=202607300658)
113+
![xlate_frontier_rps_at_bound](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/xlate_frontier_rps_at_bound.png?v=202607300729)
108114

109-
![xlate_added_latency](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/xlate_added_latency.png?v=202607300658)
115+
![xlate_added_latency](https://raw.githubusercontent.com/GetBusbar/benchmarking/main/results/xlate_added_latency.png?v=202607300729)
110116

111117
---
112118
Method: added latency = gateway p99 − direct-to-mock p99 at concurrency 1; a frontier reading = the highest req/s any probed concurrency carried while 99% of requests finished under the STATED bound and the gateway failed none it accepted (readings are published at 1, 5, 10, 50, 100 ms and with no bound; the columns above use 10 ms, and every caption names the bound it used); cost figures divide that 10 ms reading by $0.1632/hr for the pinned 4-core (m7g.xlarge) slice; RSS idle = after first 200, steady state = the level the RSS settled at under load. Same box, same mock, same load, one gateway at a time. Each gateway's source ref is pinned in its own `gateways/<name>/definition.json`; the built commit is in each row.
113119

114-
<sub>Page + charts regenerated **2026-07-30 06:58 UTC** from the raw `results/*.json`.</sub>
120+
<sub>Page + charts regenerated **2026-07-30 07:29 UTC** from the raw `results/*.json`.</sub>

0 commit comments

Comments
 (0)