Onze health check heeft een gezonde modelserver acht keer per dag herstart

Ops

Op 22 juli heeft een watchdog onze lokale modelserver acht keer herstart. Geen van die herstarts had een crash als oorzaak. De check die de modelserver online moest houden, was juist de oorzaak van de uitval.

Wat er gebeurde

De modelserver draaide vLLM op één NVIDIA GB10-machine en leverde ongeveer 8 tokens per seconde voor één verzoek. Elke vijf minuten stuurde een watchdog een echt chatverzoek en wachtte maximaal 45 seconden op het antwoord. Vijf mislukte checks op rij betekende een vastgelopen server, en de watchdog startte die opnieuw op. Een herstart nam de modelserver enkele minuten uit bedrijf terwijl ongeveer 19 GB aan gewichten opnieuw werd geladen.

Die dag hield een batchtaak twee tot vier verzoeken minutenlang bezig op de server. Het verzoek van de watchdog stond in de wachtrij achter deze verzoeken, liep op tijd uit en werd als mislukt geteld. Na vijf van zulke checks werd een gezonde server herstart. We hadden een "busy"-vlagbestand dat de watchdog respecteerde, maar de batchtaak zette deze vlag nooit.

Hoe één onterechte herstart leidde tot de volgende

Elke herstart liet de lopende verzoeken falen met een 500-fout ("cannot schedule new futures after shutdown"). Een tweede watchdog telde 500-fouten en startte de server opnieuw op bij te veel fouten; hoe meer fouten hij zag, hoe sneller hij ingreep. Zo zorgde elke onterechte herstart dat de volgende eerder kwam. In totaal konden vier aparte watchdogs die server herstarten, op timers van 5, 10, 15 en 30 minuten.

De regel die we eruit hebben gehaald

Een health check mag geen gebruikmaken van wat hij bewaakt. De schaarse bron van een modelserver zijn de slots voor lopende verzoeken. Een check die een van die slots inneemt, of erop wacht, maakt deel uit van de belasting die hij juist moet beoordelen. Check goedkoop, en start alleen opnieuw op als je kunt aantonen dat de server vastloopt.

De check die de oude verving

vLLM publiceert zijn eigen tellers op /metrics. De nieuwe check leest die eerst:

De eerste versie telde gegenereerde tokens als voortgang. Deze versie doorstond acht tests, en bij de eerste live-run vond de check de server bezet en gezond: 2 lopende verzoeken, 107 nieuwe tokens tussen de twee lezingen.

Wat we sindsdien hebben gewijzigd

Het verschil is makkelijk te zien. Toen we deze notitie schreven, draaiden beide modelserver elk 12 requests, hun limiet. Een testrequest zou in de wachtrij hebben gestaan. De nieuwe controle meldde beide als bezet en gezond, met 126 en 101 tokens per seconde, zonder er een te versturen.

Factory Floor 1.0.2 bevat deze controle als models/llm-health.py, met tests voor idle, bezette, vastgelopen en herstarte servers, een server zonder metrics, een proxy en een dode backend.

Bijgewerkt: