Ume AI Gateway
GitHub
Benchmarks

Close to zero added latency.

The gateway sits on the path of every LLM call, so it's built to add as little as possible. These runs use a fake LLM that answers instantly, so only the gateway's own work is measured. Every gateway figure on this page comes from one run (27 Oct 2026); the fake LLM, Postgres and Redis had cores of their own and stayed well below their limits.

Added latency0.97 msMedian, non-streaming, 1 client
Time to first byte1.28 msStreaming, 1 client
Peak throughput17 888Streamed msg/s on 4 vCPUs
CPU per message0.21 msGateway process, 4 vCPUs

Throughput as load grows

Streaming chat, messages per second, 4 vCPUs unless noted
Ume gateway, 27 Oct 2026

What one request costs

With warm caches, a request makes no Postgres calls on the request path. Keys and the routing catalogue live in memory; usage is written in batches in the background.

StepWhenRedis round tripsHow
Key and catalogue lookupBefore first byte0In memory; refreshed in the background
Rate limit + circuit stateBefore first byte1One Lua script and one MGET, pipelined
Budget reservationBefore first byte1One script checks key, team and department budgets
Budget reconciliationAfter response1Pipelined, off the client's critical path
Usage recordBackground0Batched, about ten records per Postgres COPY statement

Next to eneo, on the same fake LLM

Same four pinned cores for each platform. Both are called the way an external application calls them: the gateway with a virtual key, eneo with a service API key. These are different kinds of product: eneo is a chat application that stores every conversation; the gateway is a stateless proxy. The numbers show what each adds on top of the model call, not which is better.

Time per streamed answer, 1 client (median)
Ume gateway
1.6 ms
eneo v2.2.3
68.1 ms
CPU per message, 16 clients
Ume gateway
0.49 ms
eneo v2.2.3
79.2 ms
Postgres statements per message
Ume gateway
0.7, batched
eneo v2.2.3
78
Lower is better. eneo v2.2.3, its latest release, measured in the same 27 Oct 2026 run as the gateway, streaming, 30 s per point, 0 failed checks. Peak on the same four cores: 17 888 messages/s for the gateway, 51 for eneo.

What to run it on

For a quiet installation, up to about 50 messages per second with room for bursts. Measured with the gateway limited to 0.5 vCPU and 512 MB, PII detection and the content guard on, a fake LLM with a real provider's timing (about 5.6 s per streamed answer) and mixed traffic: 55 000 messages, 0 failed.

Gateway CPU at 50 msg/s0.39vCPU on average, limit 0.5
Gateway memory236 MBHighest, 100 msg/s, ~560 open streams
Added latencyNoneMeasurable at 50 and 100 msg/s
Per usage record563 BPostgres, with indexes
RecommendedCPUMemoryDisk
Gateway0.5 vCPU, up to 1256 MB, up to 512 MB–
Admin API and UI0.25 vCPU256 MB, up to 512 MB–
Postgres0.5 vCPU, up to 1512 MB, up to 1–2 GBUsage data
Redis0.1 vCPU64 MB, up to 256 MBNone
One host for everything2 vCPU4 GB20 GB + usage data
Gateway and admin API only1–1.5 vCPU1.5 GB5 GB
Usage data in Postgres, 365 days keptPer year
5 msg/s average≈ 90 GB
10 msg/s average≈ 180 GB
50 msg/s around the clock≈ 890 GB

About 560 bytes per request, kept for the retention period (90–3 650 days). Size disk by the average rate over the day, not the peak. With your own Postgres and Redis, 50 messages/s is about 50 batched inserts and 450 Redis commands per second. The admin API was not measured under load. Sizing in Production setup

Full results

The platform comparison is also a PDF.

Run it yourself

Absolute numbers depend on the machine; compare runs on the same host. Postgres and Redis ran in Docker on WSL2 here, so Redis round trips cost more than on a production network.

How to measure
PowerShell · needs Docker, Release build
# All BenchmarkDotNet benchmarks (~10 min)
dotnet run -c Release --project benchmarks\Ume.LlmGateway.Benchmarks -- --filter *

# Postgres/Redis calls per request + load test
dotnet run -c Release --project benchmarks\Ume.LlmGateway.Benchmarks -- audit

# Throughput and scaling against a fake LLM, pinned cores
cd benchmarks/compare && PLATFORMS="fake ume" ./run.sh && PLATFORMS="fake ume" ./scale.sh