Prove

Benchmark

Come si comporta il gateway Wäg rispetto a LiteLLM in condizioni identiche. Questa pagina espone il metodo per intero e pubblica le misure che ne sono risultate. Non pubblichiamo moltiplicatori.

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

Come è stata fatta la misura

Tutto è girato in Docker su una sola macchina, con ogni componente fissato ai propri core perché nulla competesse per la CPU.

  • Entrambi i gateway stanno davanti allo stesso upstream con configurazione del modello identica: nessuno dei due ha il percorso più facile.
  • Ogni gateway gira come raccomanda la sua documentazione: LiteLLM secondo la guida di produzione, con worker pari alle vCPU; Wäg con i valori predefiniti. La cache delle risposte è disattivata su entrambi.
  • I test a ciclo chiuso misurano il throughput massimo. Quelli a ciclo aperto inviano a cadenza fissa e contano la latenza dall'istante di invio previsto: un gateway che accoda non può nasconderlo.
  • Ogni risposta viene validata: stato, struttura del corpo e, per gli stream, il numero di chunk atteso e la chiusura. Tutto il resto conta come errore, mai come risposta veloce.
  • Ogni scenario viene eseguito tre volte e le tabelle mostrano la mediana. Senza gateway nel percorso lo stesso carico raggiunge circa 90.000 req/s, ben oltre entrambi i gateway: i risultati sono limitati dal gateway, non dall'harness.

Impronta

Quanto costa ogni gateway prima di servire alcunché: memoria a riposo, tempo di avvio, dimensione dell'immagine e latenza aggiunta a una singola richiesta con upstream istantaneo.

Memoria dopo l'avvio3,8 MBLiteLLM 2302 MB
Tempo di avvio0,32 sLiteLLM 11,2 s
Immagine del container123 MBLiteLLM 1669 MB
Latenza aggiunta, un client (p50)0,11 msLiteLLM 2,1 ms

Che cosa significa: La memoria decide quante repliche stanno su un nodo, la dimensione dell'immagine quanto è rapido un rollout. Con 3,8 MB residenti e un'immagine da 123 MB, Wäg sta in un sidecar ed è pronto prima che scada un health check; 2,3 GB e 11 secondi sono un pod attorno al quale bisogna pianificare.

La latenza aggiunta è il p50 del gateway meno il p50 misurato senza gateway nel percorso.

Con un upstream realistico

Un modello reale risponde in centinaia di millisecondi, quindi migliaia di richieste sono in volo insieme. Qui l'upstream impiega 300 ms e le richieste arrivano a cadenza fissa qualunque cosa faccia il gateway. A 2.000 req/s circa 600 richieste sono in corso in ogni momento.

WägLiteLLM
200 ms500 ms1,00 s2,00 s5,00 s10 s20 s50 sSoglia: 300 ms di upstream1005001,0002,000richieste al secondoLiteLLMWäg
richieste al secondoWäg p50Wäg p99Wäg ErroriWäg CPULiteLLM p50LiteLLM p99LiteLLM ErroriLiteLLM 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×
1000301 ms302 ms0,00%20,2%317 ms605 ms0,00%263,7%2,0×
2000301 ms302 ms0,00%31,7%3,26 s28 s7,99%391,9%92×

Che cosa significa: Questa è la forma del traffico reale: un modello risponde in centinaia di millisecondi e migliaia di richieste sono in volo. Un gateway che accoda trasforma una risposta da 300 ms in una da diversi secondi, e nessuno se ne accorge fino al picco. Wäg resta alla soglia fino a 2.000 req/s con meno di un terzo del suo budget di CPU. LiteLLM accoda già a 1.000 e fallisce l'8% delle richieste a 2.000.

Il solo upstream impiega 300 ms: quella è la soglia minima. Tutto ciò che la supera è tempo passato in coda dentro il gateway. La colonna × si legge sempre allo stesso modo: più alto significa che Wäg è avanti. È Wäg ÷ LiteLLM per il throughput e LiteLLM ÷ Wäg per la latenza.

Throughput e latenza

Ciclo chiuso verso un upstream istantaneo: puro costo del gateway, senza latenza del modello dietro cui nascondersi. Sono i numeri che servono a un piano di capacità. Non sono il motivo per scegliere un control plane.

4 vCPU, senza database

Client simultaneiWäg req/sWäg p99Wäg CPULiteLLM req/sLiteLLM p99LiteLLM CPU×
162320,27 ms63,4%4633,2 ms98,1%13×
825.7110,70 ms311,5%123715 ms286,1%21×
3225.0932,6 ms321,8%162146 ms385,1%15×
12823.63911 ms328,3%1669111 ms396,2%14×
51222.40745 ms336,9%1569749 ms391,6%14×

1 vCPU, senza database

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

Che cosa significa: Questo determina quante repliche servono a un dato livello di traffico, e quindi quanto costa far girare il gateway. Per Kubernetes la tabella da leggere è quella a 1 vCPU: è l'efficienza per core che un pod ottiene davvero.

Streaming, payload, embedding, failover

4 vCPU, senza database. Gli stream sono 50 token a 5 ms di distanza; il test di durata invia 200 stream al secondo di risposte da circa 1,2 secondi per tre minuti.

ScenarioWägWäg p99Wäg ErroriLiteLLMLiteLLM p99LiteLLM Errori×
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 clients358329 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×

Che cosa significa: Streaming, prompt lunghi, embedding e failover sono i percorsi su cui un carico di produzione passa il tempo. Leggete le colonne degli errori prima di quelle del throughput: una richiesta fallita è una richiesta utente fallita, non una lenta.

Il valore sui payload da 64 KB è al soffitto dell'harness: senza gateway nel percorso lo stesso carico raggiunge 3711 req/s di corpi da 64 KB su un core. Il numero di Wäg è quindi un limite inferiore, non un massimo.

Che cosa questo non mostra

Ogni benchmark descrive un allestimento. Questi sono i limiti del nostro.

  • I valori assoluti dipendono dall'host. Entrambi i gateway hanno girato sulla stessa macchina con core fissati, quindi il confronto tra loro regge, ma aspettatevi valori assoluti diversi sul vostro hardware.
  • L'harness che ha guidato queste prove non è pubblicato, quindi non potete ripeterle comando per comando. Il metodo sopra è descritto in modo abbastanza dettagliato da ricostruirne uno equivalente.
  • LiteLLM rilascia quasi ogni settimana. Questi dati sono stati misurati con v1.104.2, l'attuale versione stabile. Quando una versione cambia il percorso di inoltro, rieseguiamo la prova e pubblichiamo i risultati.
  • LiteLLM è stato configurato secondo la sua guida di produzione, non dai suoi manutentori. Potrebbe esistere una configurazione migliore: se ne trovate una, rieseguiremo e ripubblicheremo.
  • Entrambi i gateway hanno girato su una sola macchina con core fissati. Nulla qui misura il comportamento attraverso una rete, sotto lo scheduling di Kubernetes o con vicini rumorosi.