Bewijs

Benchmarks

Hoe de Wäg-gateway het doet tegenover LiteLLM onder identieke omstandigheden. Deze pagina zet de methode volledig uiteen en publiceert de metingen die eruit kwamen. Wij publiceren geen vermenigvuldigingsfactoren.

8 vCPU Docker, pinned coresWäg v1.0.0LiteLLM v1.104.23 runs/scenario

Hoe er is gemeten

Alles draaide in Docker op één machine, met elk onderdeel vastgezet op eigen cores zodat niets om CPU concurreerde.

  • Beide gateways staan voor dezelfde upstream met identieke modelconfiguratie, dus geen van beide heeft het makkelijkere pad.
  • Elke gateway draait zoals de eigen documentatie aanraadt: LiteLLM volgens de productiegids, met evenveel workers als vCPU's; Wäg met de meegeleverde standaardinstellingen. Response-caching staat bij beide uit.
  • Closed-looptests meten de maximale doorvoer. Open-looptests versturen op een vast schema en rekenen de latency vanaf het bedoelde verzendmoment, zodat een gateway die in de wachtrij zet dat niet kan verbergen.
  • Elk antwoord wordt gevalideerd: status, opbouw van de body en bij streams het verwachte aantal chunks met afsluiting. Al het andere telt als fout, nooit als snel antwoord.
  • Elk scenario draait drie keer en de tabellen tonen de mediaan. Zonder gateway in het pad haalt dezelfde belasting ongeveer 90.000 req/s, ver boven beide gateways, dus de resultaten worden begrensd door de gateway en niet door het harnas.

Voetafdruk

Wat elke gateway kost voordat hij iets bedient: geheugen in rust, opstarttijd, imagegrootte en de latency die hij toevoegt aan één verzoek bij een direct antwoordende upstream.

Geheugen na opstarten3,8 MBLiteLLM 2.302 MB
Opstarttijd0,32 sLiteLLM 11,2 s
Container-image123 MBLiteLLM 1.669 MB
Toegevoegde latency, één client (p50)0,11 msLiteLLM 2,1 ms

Wat dit betekent: Geheugen bepaalt hoeveel replica's op een node passen, en imagegrootte hoe snel een uitrol is. Met 3,8 MB resident en een image van 123 MB past Wäg in een sidecar en is hij klaar voordat een health check verloopt; 2,3 GB en 11 seconden is een pod waar je omheen plant.

De toegevoegde latency is de p50 van de gateway minus de p50 gemeten zonder gateway in het pad.

Bij een realistische upstream

Een echt model antwoordt in honderden milliseconden, dus zijn er duizenden verzoeken tegelijk onderweg. Hier doet de upstream er 300 ms over en komen verzoeken op een vast tempo binnen, wat de gateway ook doet. Bij 2.000 req/s zijn er steeds ongeveer 600 verzoeken onderhanden.

WägLiteLLM
200 ms500 ms1,00 s2,00 s5,00 s10 s20 s50 sOndergrens: 300 ms upstream1005001,0002,000verzoeken per secondeLiteLLMWäg
verzoeken per secondeWäg p50Wäg p99Wäg FoutenWäg CPULiteLLM p50LiteLLM p99LiteLLM FoutenLiteLLM CPU×
100303 ms305 ms0,00%10,2%305 ms308 ms0,00%38,7%1,0×
500301 ms303 ms0,00%15,6%304 ms321 ms0,00%140,5%1,1×
1.000301 ms302 ms0,00%20,2%317 ms605 ms0,00%263,7%2,0×
2.000301 ms302 ms0,00%31,7%3,26 s28 s7,99%391,9%92×

Wat dit betekent: Dit is de vorm van echt verkeer: een model antwoordt in honderden milliseconden en duizenden verzoeken zijn onderweg. Een gateway die in de wachtrij zet maakt van een antwoord van 300 ms er een van meerdere seconden, en niemand merkt het tot de piek. Wäg blijft tot 2.000 req/s op de ondergrens met minder dan een derde van zijn CPU-budget. LiteLLM staat bij 1.000 al in de wachtrij en laat bij 2.000 8% van de verzoeken mislukken.

De upstream alleen kost al 300 ms: dat is de ondergrens. Alles daarboven is wachttijd in de wachtrij van de gateway. De kolom × leest altijd hetzelfde: hoger betekent dat Wäg voorligt. Het is Wäg ÷ LiteLLM voor doorvoer en LiteLLM ÷ Wäg voor latency.

Doorvoer en latency

Closed loop tegen een direct antwoordende upstream: puur de kosten van de gateway, zonder modellatency om je achter te verschuilen. Dit zijn de getallen die een capaciteitsplan nodig heeft. Ze zijn niet de reden om een control plane te kiezen.

4 vCPU, zonder database

Gelijktijdige clientsWäg req/sWäg p99Wäg CPULiteLLM req/sLiteLLM p99LiteLLM CPU×
16.2320,27 ms63,4%4633,2 ms98,1%13×
825.7110,70 ms311,5%1.23715 ms286,1%21×
3225.0932,6 ms321,8%1.62146 ms385,1%15×
12823.63911 ms328,3%1.669111 ms396,2%14×
51222.40745 ms336,9%1.569749 ms391,6%14×

1 vCPU, zonder database

Gelijktijdige clientsWäg req/sWäg p99LiteLLM req/sLiteLLM p99×
16.5890,35 ms4593,2 ms14×
816.5941,3 ms48426 ms34×
3215.2263,8 ms50685 ms30×
12813.26415 ms505438 ms26×

Wat dit betekent: Dit bepaalt hoeveel replica's een verkeersniveau nodig heeft, en daarmee wat de gateway kost om te draaien. Voor Kubernetes is de tabel met 1 vCPU de relevante: dat is de efficiëntie per core die een pod werkelijk krijgt.

Streaming, payloads, embeddings, failover

4 vCPU, zonder database. Streams zijn 50 tokens met 5 ms ertussen; de duurtest stuurt drie minuten lang 200 streams per seconde van ongeveer 1,2 seconde.

ScenarioWägWäg p99Wäg FoutenLiteLLMLiteLLM p99LiteLLM Fouten×
Streaming, 64 clients233286 ms0,00%179674 ms0,00%1,3×
Streaming, 256 clients911288 ms0,00%3071,09 s0,00%3,0×
64 KB conversation history, 32 clients3.58329 ms0,00%568106 ms0,00%6,3×
Embeddings (1,536 dims), 32 clients13.5584,3 ms0,00%74069 ms0,00%18×
Fallback after upstream 500, 16 clients19.8161,8 ms0,00%58462 ms0,00%34×
Soak: 200 streams/s for 3 minutes2001,27 s0,00%17620 s12,09%1,1×

Wat dit betekent: Streaming, lange prompts, embeddings en failover zijn de paden waar een productielast zijn tijd doorbrengt. Lees de foutkolommen vóór de doorvoerkolommen: een mislukt verzoek is een mislukt gebruikersverzoek, geen traag verzoek.

Het cijfer voor payloads van 64 KB zit tegen het plafond van het harnas: zonder gateway in het pad haalt dezelfde belasting 3.711 req/s aan bodies van 64 KB op één core, dus het getal van Wäg is daar een ondergrens en geen maximum.

Wat dit niet laat zien

Elke benchmark beschrijft één opstelling. Dit zijn de grenzen van deze.

  • Absolute getallen hangen af van de host. Beide gateways draaiden op dezelfde machine met vastgezette cores, dus de vergelijking onderling houdt stand, maar verwacht op uw eigen hardware andere absolute waarden.
  • Het harnas achter deze metingen is niet gepubliceerd, dus u kunt ze niet commando voor commando herhalen. De methode hierboven is gedetailleerd genoeg beschreven om een gelijkwaardige opstelling na te bouwen.
  • LiteLLM brengt bijna wekelijks uit. Deze cijfers zijn gemeten tegen v1.104.2, de huidige stabiele release. Zodra een release het doorsturingspad verandert, meten we opnieuw en publiceren we wat eruit komt.
  • LiteLLM is geconfigureerd volgens de eigen productiegids, niet door de maintainers. Er bestaat mogelijk een betere configuratie; vindt u er een, dan meten we opnieuw en publiceren we opnieuw.
  • Beide gateways draaiden op één machine met vastgezette cores. Niets hiervan meet gedrag over een netwerk, onder Kubernetes-scheduling of met luidruchtige buren.