Overvågningsstak: Prometheus, Grafana, DCGM, Loki til AI-servere

En AI-server, som ingen holder øje med, er en server, der lydløst drosler, lækker VRAM, akkumulerer ECC-fejl eller bliver OOM-dræbt klokken 03:00 – og man finder ud af det tre dage senere, når nogen spørger, hvorfor deres finjustering producerede noget vrøvl. De fleste af de værste fejltilstande på en GPU-boks er usynlige fra applikationen: termisk drossel logger ikke til stderr, ECC-korrektioner får ikke noget til at gå ned med det samme, OOM-dræberen æder en proces, og orkestratoren genstarter den uden problemer. Uden metrikker på selve hardwaren ser man ikke noget af dette, før det allerede har kostet en uge.

Standard sysadmin-værktøjssættet (htop, df, uptime, syslog) dækker det ikke. GPU'en er den dyreste komponent i kabinettet og den mest fejlbehæftede, og den har sin egen telemetristak, der kræver eksplicit installation. Denne artikel er den velfunderede version af den stak - Prometheus, Grafana, DCGM-exporter, node_exporter, Loki og Alertmanager - pakket som en enkelt docker-compose-implementering, vi kører på alle Kentino AI-servere, vi leverer.

Publikummet er en person, der står oprejst med en 4-GPU eller 8-GPU AI-server, som kan skrive en docker-compose-fil og ønsker svaret på "hvad skal jeg egentlig overvåge, og ved hvilken tærskel skal jeg alarmere?".

Standardstakken i 2026

Fem komponenter klarer næsten alt arbejdet. Alt andet er en bolt-on.

Component roller Inaktiv fodaftryk
Prometheus Tidsseriedatabase + scrape-orkestrator ~150 MB RAM, ~3 MB/s
grafana Dashboards, brugergrænseflade til alarmer ~120 MB RAM
DCGM-eksportør GPU-målinger (temperatur, forbrug, strøm, hukommelse, ECC, XID) ~30 MB RAM, <0.1% CPU
node_exporter Systemmålinger (CPU, RAM, disk, net, hwmon) ~15 MB RAM
Loki + Promtail Logsamling og afsender ~100 MB RAM
Alertmanager Advarselsrouting (e-mail, Slack, PagerDuty, webhook) ~25 MB RAM

I alt godt under 0.5% af én CPU-kerne på en 96-core EPYC og cirka 700 MB RAM. På en 256 GB / 8-GPU server er dette en afrundingsfejl. Argumentet "overvågning stjæler cyklusser fra træning" holdt op med at være sandt omkring 2019.

Den ene arkitektoniske beslutning, der er værd at træffe på forhånd: kør stakken på en separat administrations-VM eller en lille boks, ikke på selve GPU-serveren. En dedikeret mini-PC, en NUC, en EPYC-servicenode eller en VM på laboratoriets hypervisor - alt, der ikke er GPU-boksen. To grunde: Når GPU-serveren går ned (kernelpanik på grund af out-of-memory, PSU-trip, termisk nedlukning), ønsker du stadig, at metrics-historikken diagnosticerer, hvad der skete, og du ønsker ikke et løbsk træningsjob, der konkurrerer med Prometheus om hukommelse og udløser sin egen alarm. DCGM-exporter og node_exporter kører på GPU-værten (de skal - de læser lokale enheder); Prometheus, Grafana, Loki og Alertmanager kører på administrations-VM'en og scraper indad.

DCGM-eksportør — den ene ting du ikke kan springe over

NVIDIAs Data Center GPU Manager (DCGM) er den understøttede, autoritative kilde til GPU-telemetri. dcgm-exporter Containeren eksponerer DCGM-metrikker i Prometheus-format på port 9400. Det er den vigtigste komponent i stakken, og det er det, der nvidia-smi afstemninger vil aldrig erstatte.

Installer via NGC-containeren (nvcr.io/nvidia/k8s/dcgm-exporter, i øjeblikket 4.x fra midten af ​​2026) eller upstream Helm-diagrammet for Kubernetes. På bare Docker, en docker run --gpus all --rm er nok; dæmonen udgiver derefter ~80 metrikker på :9400/metricsDem der rent faktisk betyder noget, rangeret efter hvor ofte de opdager reelle problemer:

metric Hvad den fortæller dig Alarmgrænse
DCGM_FI_DEV_GPU_TEMP GPU-kernetemperatur (°C) > 80 °C advarsel, 87 °C kritisk
DCGM_FI_DEV_MEMORY_TEMP VRAM / hukommelsesforbindelsestemperatur (°C) > 95 °C advarsel, 105 °C kritisk
DCGM_FI_DEV_GPU_UTIL SM-beregningsudnyttelse (%) < 5% med allokeret VRAM → proces hang
DCGM_FI_DEV_FB_USED Framebuffer (VRAM) brugt i MiB > 95% af det samlede antal
DCGM_FI_DEV_POWER_USAGE Strømforbrug (W) > TDP × 0.98 vedvarende
DCGM_FI_DEV_PCIE_TX_THROUGHPUT PCIe TX-båndbredde (KiB/s) vedvarende loft = regression af stigrør/bane
DCGM_FI_DEV_ECC_SBE_VOL_TOTAL Antal korrigerbare ECC-fejl hastighedsforøgelse > 10× baseline
DCGM_FI_DEV_ECC_DBE_VOL_TOTAL Antal ukorrigerbare ECC-fejl enhver
DCGM_FI_DEV_THERMAL_VIOLATION Kumulative ns brugt i termisk drossel hastighed > 0
DCGM_FI_DEV_POWER_VIOLATION Kumulative ns brugt i gashåndtag hastighed > 0
DCGM_FI_DEV_XID_ERRORS XID-fejlantal (driver-/hardwarefejl) enhver

Gasspjældstællerne er den afgørende funktion. DCGM_FI_DEV_THERMAL_VIOLATION er en monotonisk tæller på nanosekunder, som GPU'en brugte på at drosle. Beregn dens hastighed over et 5-minutters vindue, og du har et præcist svar på "er min server termisk begrænset lige nu?". Uden den gætter du udelukkende ud fra temperaturen, hvilket er en løgn - en 4090 vil drosle ved 83 °C ved en vedvarende arbejdsbelastning, uanset hvad temperaturpanelet viser.

To kendte DCGM-eksportør-særheder, der er værd at kende i 2026: nogle XID-koder (især XID 62) dukker ikke altid op gennem DCGM_FI_DEV_XID_ERRORS, og metrikken er en målestok for sidste XID set — så det kan mislykkes at nulstille efter en gendannelse uden at genstarte eksportøren. Afhjælpningen er at også se kernel-ringbufferen via Loki for den bogstavelige NVRM: Xid snor (mere om det nedenfor). Bælte og seler.

For rene forbrugerkort (RTX 4090, 5090) er nogle DCGM-datacenterfunktioner delvise — MIG er ikke til stede, NVLink er fraværende på Blackwell-forbrugerdele, visse ECC-tællere returnerer nul. DCGM fungerer stadig og rapporterer, hvad der er eksponeret; det lette community-alternativ. nvidia_gpu_exporter (som skraber nvidia-smi) er en brugbar fallback, hvis du ikke ønsker DCGMs afhængighedskæde. For Pro 6000 Blackwell, L40 og L4 — alt i datacenter/pro-serien — skal du bruge DCGM, ikke wrapperen.

node_exporter — systemhalvdelen

GPU-målinger fortæller kun halvdelen af ​​historien. node_exporter dækker resten:

Metrisk familie Hvorfor det er vigtigt på en AI-boks
node_cpu_seconds_total CPU-mætning — vLLM-tokenizere og dataloadere elsker en CPU
node_memory_MemAvailable_bytes System-RAM — lækage af trænings- og inferensarbejdsgange
node_disk_io_time_seconds_total NVMe-mætning — datasætindlæsere, checkpoint-skrivninger
node_filesystem_avail_bytes Diskplads — modelvægte er 50-150 GB hver (krydsreference L04)
node_network_receive_bytes_total Netværksgennemstrømning — træning af flere noder, inferensklienter
node_load_average Hurtig sundhedsproxy
node_hwmon_temp_celsius CPU- og chipsettemperaturer, PSU-temperaturer på nogle bundkort
node_vmstat_oom_kill OOM-killer affyret — den mest oversete alarm i enhver udsendelse

Fejltilstanden "system-RAM opbrugt, OOM-killer tager vLLM, container genstarter korrekt" registreres her, ikke af DCGM. Se node_memory_MemAvailable_bytes og alarm når det falder til under 5% af det samlede antal. På Linux aktiveres killer-funktionen som standard ved næsten 0%, men på det tidspunkt er din proces død.

Prometheus — konfiguration, fastholdelse, størrelsesjustering

Prometheus er tidsseriedatabasen og scrape-orkestratoren. Standardindstillingerne er rimelige; de ​​to indstillinger, der er værd at ændre på dag ét, er scrape-interval og retention.

Et scrape-interval på 15 sekunder er det rigtige udgangspunkt for en AI-server: hurtigt nok til at fange en termisk stigning, før den bliver en vedvarende hastighedsreduktion, langsomt nok til at tidsserieomkostningerne forbliver moderate. Standardværdien for opbevaring er 15 dage; 30 dage er et bedre tal i en build-guide-kontekst, hvor du kan sammenligne dagens adfærd med sidste måneds ændring i tuning.

Lagerbudget ved 15 s scrape, ~80 DCGM-metrikker × N GPU'er + ~400 node_exporter-metrikker + ~50 vLLM-metrikker: cirka 1.5-2 GB pr. uge, så 30 dage lander på 6-10 GB på en 8-GPU-boks. Indstil både retention efter tid og efter størrelse som et beskyttelsesrækværk:

command:
  - "--storage.tsdb.retention.time=30d"
  - "--storage.tsdb.retention.size=20GB"

Begge grænser udløser komprimering; den der rammes først vinder. En allokering på 100 GB giver dig over et år med plads uden at skulle tænke dig om.

Grafana dashboards — start med de præbyggede

Byg ikke dashboards fra bunden. Det har fællesskabet gjort.

Hovedmenu Grafana.com-ID Hvad det dækker over
NVIDIA DCGM eksportør Dashboard 12239 Den officielle NVIDIA One – alle GPU-målinger
Nodeeksportør fuld 1860 CPU / RAM / disk / netværk
Loki / Promtail-logfiler 13639 Logsøgning og -udforskning
vLLM-service (fællesskab) varierer TTFT, TPOT, kødybde, KV-cache

Importer først 12239 og 1860. De dækker ~90% af det, du rent faktisk vil se på, og er blevet forfinet over årene. Byg først dine egne efter en måned, når du ved, hvilke paneler du rent faktisk åbner. De mindre ændringer, der er værd at foretage for Kentino AI-hardware, er: indstilling af GPU-temperaturtærskelpanelerne til Blackwell-passende intervaller (5090-gasspjæld nær 87 °C, RTX Pro 6000 tættere på 90 °C) og tilføjelse af et panel pr. PCIe-slot, der viser DCGM_FI_DEV_PCIE_LINK_GEN og DCGM_FI_DEV_PCIE_LINK_WIDTH så du med et hurtigt blik kan se, om en riser er faldet fra x16 til x8.

Loki — logfiler, der forklarer, hvad metrikkene viser

Målinger fortæller dig, hvad der er ændret; logfiler fortæller dig hvorfor . Loki er Grafanas logdatabase; Promtail er den afsender, der indsamler filer og sender dem. Ret Promtail mod:

  • /var/log/syslog og journalctl -k — kernel OOM-meddelelser, klager over NVIDIA-drivere, XID-dumps
  • /var/log/nvidia-installer.log — driverinstallationsstatus
  • vLLM container stdout (via Docker JSON-logdriveren)
  • Applikationslogfiler fra alt, hvad kunden kører

Den forespørgsel med den højeste værdi i Grafanas faneblad Udforsk er:

{job="syslog"} |= "NVRM:"

Dette viser alle NVIDIA-drivermeddelelser i kernel-ringbufferen — XID-fejl, blæserfejl, hændelser, der er gået af bussen, GSP RPC-timeouts. Par det med DCGM_FI_DEV_XID_ERRORS Prometheus-alarmen, og du har både den strukturerede metrik og den ustrukturerede detalje i én rude.

Vi sender ikke logs off-host som standard. Loki opbevarer dem lokalt med 30-dages opbevaring; on-call SSH-tunneler overføres til Grafana efter behov. Kunder, der ønsker centraliserede logs på tværs af flere servere, kan henvise Loki til S3 eller køre en regional instans – det er et implementeringsspørgsmål, ikke et arkitekturspørgsmål.

vLLM- og SGLang-målinger — instrumentér appen, ikke kun metallet

DCGM fortæller dig, at GPU'en er optaget. Den fortæller dig ikke, om inferensanmodninger returneres om 200 ms eller 2 s. Til det formål instrumenterer du serveringslaget.

vLLM-eksponeringer /metrics native på samme port som OpenAI API'en. Med standardindstillingerne er slutpunktet ved :8000/metrics udgiver Prometheus-målinger med vllm: præfiks (som bliver vllm_ efter Prometheus-skrab). Dem der er værd at skrabe:

vLLM-metrik Betydning
vllm:e2e_request_latency_seconds End-to-end anmodningslatenstid (histogram)
vllm:time_to_first_token_seconds TTFT — det tal, brugerne rent faktisk føler
vllm:time_per_output_token_seconds Hastighed for generering af tokens (histogram)
vllm:num_requests_running Aktive anmodninger under flyvning
vllm:num_requests_waiting Kødybde
vllm:gpu_cache_usage_perc KV-cache-udnyttelse (0–1)
vllm:request_prompt_tokens Hurtig længdefordeling

Kombinationen vllm:num_requests_waiting > 0 og DCGM_FI_DEV_GPU_UTIL < 90% betyder, at køen sikkerhedskopieres, mens GPU'en er inaktiv – normalt en flaskehals i tokenizer- eller scheduler-tilstand, ikke en beregningstilstand. Det ser man kun med begge metrikker i det samme dashboard, hvilket er hele pointen med at forene app- og hardwaretelemetri i én Prometheus.

NVIDIA NIM eksponerer de samme vLLM-målinger under /v1/metrics uden at omdøbe dem, så dine eksisterende vLLM-dashboards og alarmregler overføres uændret til en NIM-serveret implementering. SGLang udgiver et lignende sæt på sin egen port (standard 30000); llama.cpps HTTP-server eksponerer et mindre delmængde. Triton udgiver sin egen taksonomi. Uanset hvad du serverer, skal du scrape applikationen - ikke kun hardwaren.

Alertmanager-regler — de regler, vi faktisk sender

Dashboards er flotte. Alarmer er nyttige. Reglerne nedenfor er dem, der har opdaget reelle problemer på rigtig kundehardware.

groups:
  - name: gpu
    interval: 30s
    rules:
      - alert: GPUTempCritical
        expr: DCGM_FI_DEV_GPU_TEMP > 87
        for: 30s
        labels: { severity: critical }
        annotations:
          summary: "GPU {{ $labels.gpu }} thermal critical ({{ $value }} °C)"

      - alert: GPUThermalThrottling
        expr: rate(DCGM_FI_DEV_THERMAL_VIOLATION[5m]) > 0
        for: 1m
        labels: { severity: warning }

      - alert: GPUECCUncorrectable
        expr: increase(DCGM_FI_DEV_ECC_DBE_VOL_TOTAL[10m]) > 0
        labels: { severity: critical }
        annotations:
          summary: "GPU {{ $labels.gpu }} uncorrectable ECC — schedule replacement"

      - alert: GPUXIDError
        expr: increase(DCGM_FI_DEV_XID_ERRORS[5m]) > 0
        labels: { severity: critical }

      - alert: GPUPowerEnvelopeExceeded
        expr: DCGM_FI_DEV_POWER_USAGE > 590  # 5090 nominal 575 W; alarm above sustained ceiling
        for: 5m
        labels: { severity: warning }

      - alert: GPUIdleDuringWork
        expr: DCGM_FI_DEV_GPU_UTIL < 5 and DCGM_FI_DEV_FB_USED > 1024
        for: 10m
        labels: { severity: warning }
        annotations:
          summary: "GPU {{ $labels.gpu }} idle with VRAM allocated — likely hung"

  - name: system
    interval: 30s
    rules:
      - alert: HostMemoryLow
        expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.05
        for: 2m
        labels: { severity: critical }

      - alert: OOMKillerFired
        expr: increase(node_vmstat_oom_kill[5m]) > 0
        labels: { severity: critical }

      - alert: ContainerRestartLoop
        expr: rate(container_start_time_seconds[15m]) > 3
        for: 10m
        labels: { severity: warning }

  - name: serving
    interval: 30s
    rules:
      - alert: vLLMQueueBacklog
        expr: vllm:num_requests_waiting > 10
        for: 5m
        labels: { severity: warning }

      - alert: vLLMHighLatency
        expr: histogram_quantile(0.95, rate(vllm:e2e_request_latency_seconds_bucket[5m])) > 10
        for: 5m
        labels: { severity: warning }

Meningsfulde opfordringer i disse regler:

  • 87 °C er kritisk for GPU-temperaturen. En 5090 drosler ned i de høje 80'ere på de fleste bundkort. Hvis dit rum ikke kan holde kortene under 80 °C ved vedvarende belastning, har du et HVAC-problem, ikke et softwareproblem.
  • Ethvert ukorrigerbart ECC kalder den tilgængelige vagt. En enkelt dobbelt-bit ECC-hændelse ugyldiggør det, der var på den VRAM-side — et træningstrin er forkert, et inferensresultat er forkert. Kortet skal udskiftes, ikke genstartes.
  • GPUIdleDuringWork er deadlock-detektoren. > 1 GiB allokeret og < 5% utilgængeligt i 10 minutter betyder, at noget sidder fast. Opfanger CUDA-sidede hængninger, som applikationen ignorerer med glæde.
  • OOM killer alert er den mest oversete regel i enhver implementering. Linux dræber stille og roligt dit træningsjob, og Docker genstarter det rent. og fejltilstand, der spilder flest ingeniørtimer om året. Gør det højlydt.
  • Containergenstartsløkke fanger NIM- og vLLM-genstartscyklusser der ser sunde ud udefra (containeren "kører"), men som faktisk går ned ved hver modelindlæsning.

Kabinet og lagerplads — IPMI og SMART

DCGM stopper ved GPU'en. node_exporter stopper ved operativsystemet. Resten af ​​kabinettet - blæsere, strømforsyninger, omgivende temperatur, lagertilstand - har brug for to eksportører mere.

ipmi_exporter (prometheus-community) kommunikerer med BMC via IPMI/RMCP og viser telemetri på chassisniveau: omdrejninger pr. ventilator, PSU-indgangsspænding og -strøm, systemhændelseslogposter, omgivende indgangstemperatur, BMC watchdog-tilstand. På et Supermicro- eller Bone64c-chassis med en fungerende BMC er dette en halv arbejdsdag og fanger ting, som DCGM bogstaveligt talt ikke kan se — en defekt PSU på dual-PSU 8-GPU-buildet vises som et spændingsfald i ipmi-sensordataene minutter før en GPU springer til XID 79. Kør det på værten (det skal bruge /dev/ipmi0) eller eksternt med gemte BMC-legitimationsoplysninger ved hjælp af multi-target-eksportørmønsteret.

smartctl_exporter (eller den ældre smart_exporter) læser NVMe- og SATA SMART-attributter: indikator for slid på medier, tilgængelig reserve, temperatur, fejlantal. AI-arbejdsbelastninger er brutale på NVMe — datasætindlæsere, checkpoint-skrivninger og HuggingFace-cacher presser slidmål for virksomheder på flere måneder på drev i forbrugerklassen. Metrikken til at alarmere er nvme_available_spare falder til under 20% og nvme_percentage_used (slidindikatoren) stiger over 80 %. Drevfejl er den næstmest almindelige hardwarefejl på en travl AI-server efter riser/PSU-klassen.

En komplet Kentino AI-overvågningsimplementering inkluderer begge dele. Marginalomkostningerne er minutter; værdien første gang en ventilator fejler lydløst, eller en Samsung 990 Pro rammer sit DWPD-loft, er timer.

En rigtig docker-compose til administration af VM'en

Hvad vi rent faktisk implementerer på administrationsboksen. Juster host.docker.internal (eller brug GPU-serverens værtsnavn/IP) til at pege Prometheus mod GPU-værtens eksportørporte.

version: "3.8"

networks:
  monitoring: { driver: bridge }

volumes:
  prometheus_data:
  grafana_data:
  loki_data:

services:
  prometheus:
    image: prom/prometheus:v3.0.0
    restart: unless-stopped
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./rules:/etc/prometheus/rules:ro
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--storage.tsdb.retention.time=30d"
      - "--storage.tsdb.retention.size=20GB"
      - "--web.enable-lifecycle"
    ports: ["9090:9090"]
    networks: [monitoring]

  grafana:
    image: grafana/grafana:11.4.0
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_PASSWORD__FILE=/run/secrets/grafana_pw
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
    secrets: [grafana_pw]
    ports: ["3000:3000"]
    networks: [monitoring]

  alertmanager:
    image: prom/alertmanager:v0.28.0
    restart: unless-stopped
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
    ports: ["9093:9093"]
    networks: [monitoring]

  loki:
    image: grafana/loki:3.3.0
    restart: unless-stopped
    command: -config.file=/etc/loki/loki.yml
    volumes:
      - ./loki.yml:/etc/loki/loki.yml:ro
      - loki_data:/loki
    ports: ["3100:3100"]
    networks: [monitoring]

secrets:
  grafana_pw: { file: ./secrets/grafana_pw.txt }

På selve GPU-værten (separat compose, på GPU-serveren):

services:
  dcgm-exporter:
    image: nvcr.io/nvidia/k8s/dcgm-exporter:4.5.1-4.8.0-ubuntu22.04
    restart: unless-stopped
    runtime: nvidia
    environment: [NVIDIA_VISIBLE_DEVICES=all]
    cap_add: [SYS_ADMIN]
    ports: ["9400:9400"]

  node-exporter:
    image: prom/node-exporter:v1.9.0
    restart: unless-stopped
    pid: host
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - "--path.procfs=/host/proc"
      - "--path.sysfs=/host/sys"
      - "--path.rootfs=/rootfs"
    ports: ["9100:9100"]

  ipmi-exporter:
    image: prometheuscommunity/ipmi-exporter:v1.10.0
    restart: unless-stopped
    privileged: true
    volumes: ["/dev/ipmi0:/dev/ipmi0"]
    ports: ["9290:9290"]

  smartctl-exporter:
    image: prometheuscommunity/smartctl-exporter:v0.13.0
    restart: unless-stopped
    privileged: true
    ports: ["9633:9633"]

  promtail:
    image: grafana/promtail:3.3.0
    restart: unless-stopped
    volumes:
      - /var/log:/var/log:ro
      - ./promtail.yml:/etc/promtail/promtail.yml:ro
    command: -config.file=/etc/promtail/promtail.yml

Prometheus-scrapekonfigurationen på den virtuelle styringsmaskine:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - /etc/prometheus/rules/*.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["alertmanager:9093"]

scrape_configs:
  - job_name: dcgm
    static_configs:
      - targets: ["k-ai-01.lan:9400", "k-ai-02.lan:9400"]

  - job_name: node
    static_configs:
      - targets: ["k-ai-01.lan:9100", "k-ai-02.lan:9100"]

  - job_name: ipmi
    static_configs:
      - targets: ["k-ai-01.lan:9290", "k-ai-02.lan:9290"]

  - job_name: smart
    static_configs:
      - targets: ["k-ai-01.lan:9633", "k-ai-02.lan:9633"]

  - job_name: vllm
    metrics_path: /metrics
    static_configs:
      - targets: ["k-ai-01.lan:8000"]

Det er en fungerende stak til et laboratorium med én til tre servere. Skift Prometheus-scrapekonfigurationen til filbaseret serviceopdagelse, eller – hvis du bruger Kubernetes – til GPU-operatørens medfølgende DCGM-eksporter Helm-diagram og Prometheus-operatørens. ServiceMonitor CRD'er.

OpenTelemetry, Pixie, eBPF — billedet fra 2026

En bemærkning om de bevægelige dele, for spørgsmålet dukker altid op.

OpenTelemetry er CNCF-standarden for observerbarhedsinstrumentering, og fra starten af ​​2026 er alle tre signaltyper (metrikker, spor, logfiler) stabile. OTel Collector-pipelinen erstatter leverandørspecifikke agenter i mange organisationer som den universelle telemetri-router. For en AI-server er det pragmatiske svar i 2026: behold Prometheus til metrikker (DCGM-exporter og node_exporter bruger Prometheus som standard, og PromQL er det, dine alarmregler indeholder), og tilføj en OTel Collector, hvis og når du har brug for distribueret sporing på tværs af en inferensserverende graf (request → API gateway → vLLM → tool call → vector DB → response). For en enkeltserverinstallation med én model bag nginx tilføjer OTel omkostninger uden værdi. De 71% af organisationerne, der "bruger begge", bruger Prometheus til metallerne og OTel til app-spor - en fornuftig opdeling.

Pixie er et Kubernetes-native observationsværktøj, der bruger eBPF til at indsamle metrikker, spor og logs på kerneniveau uden kodeændringer. Den udvikling i 2026, der er værd at følge, er eBPF-on-GPU-arbejdet (bpftime, eGPU, NVIDIAs åbne kernemoduler), der udvider eBPF-instrumentering til GPU-kerner via runtime PTX-injektion. Dette er i dag på forskningsniveau og ikke en del af nogen af ​​de produktionsstak, vi leverer. For nuværende er DCGM det understøttede svar.

Kontinuerlig profilering (Grafana Phlare, Pyroscope) er en tredje tilføjelse, der er værd at kende til. For inferens-workloads, hvor du kontrollerer framework-koden (brugerdefinerede vLLM-patches, tokenizer-optimeringer), fortæller den dig, hvilke funktioner der bruger CPU'en. For ren modelservering med standardcontainere er det overkill.

Hvad går i stykker (overvågningsudgave)

Forudsigelige fejltilstande for selve stakken, rangeret efter hvor ofte de bider:

  • Prometheus-disken fyldes op. Standardopbevaring er 15 dage; vi sætter 30 med et loft på 20 GB. Planlæg med ti GB i de sidste 60 dage på en travl boks. Indstil opbevaring efter både tid og størrelse.
  • DCGM-eksportøren mister GPU'er efter en driveropgradering. Symptom: Alle GPU-paneler bliver tomme. Løsning: Genstart containeren; kør igen nvidia-ctk runtime configure hvis kørselstiden flyttede sig.
  • Alertmanager er ikke konfigureret til den modtager, du rent faktisk bruger. Folk sætter sig op i Prometheus og Grafana, glemmer at pege Alertmanager på e-mail eller Slack og opdager seks måneder senere, at ingen alarm nogensinde er blevet udløst. Test ved bevidst at aktivere GPUTempCritical med en stressende arbejdsbyrde, eller brug amtool alert add at udløse en syntetisk alarm på dag ét.
  • Kardinalitetseksplosion fra etiketter pr. anmodning. Mærk ikke vLLM-målinger med user_id or request_idPrometheus er ikke designet til det — du vil OOM-e databasen.
  • Grafana-adgangskodelækage via compose-miljø. Brug Docker-hemmeligheder, ikke GF_SECURITY_ADMIN_PASSWORD i miljøblokken. docker inspect og logfiler lækker miljøværdier.
  • XID-måler, der ikke nulstilles. Som nævnt kan DCGM-eksportørens XID-måler holde sig til den sidst observerede værdi efter gendannelse. Kombiner metrikken med Lokis NVRM: syslog-hale for at undgå falsk tillid.

Den ærlige holdning

De fleste laboratorier installerer Grafana én gang, bygger et dashboard, som teamet beundrer i en uge, og ser det aldrig igen. Dashboardet er et tilfredsstillende artefakt; det er ikke det, der fanger dine problemer. Alarmer er det, der fanger dine problemer. Opsæt Alertmanager med en rigtig modtager (e-mail, Slack, PagerDuty) og et lille sæt højpræcisionsregler - GPU-temperatur, ECC double-bit, XID, OOM killer, container restart loop - og finjuster dem, indtil de kun aktiveres, når noget rent faktisk er galt. Gør dette først. Byg derefter dashboards til fejlfindingshistorien efter hændelsen.

Den anden halvdel af den ærlige vinkel: på Kentino-skala med én server får du måske en alarm fra denne stak en gang om måneden, og de fleste måneder vil det være en falsk positiv, du fravælger. Det er systemet, der fungerer. Værdien er den alarm, der udløses den dag, en riser begynder at koge, to dage før kortet når XID 79, hvor der stadig er tid til at genindsætte et kabel i stedet for at RMA en GPU. Den ene hændelse betaler for hele overvågningsindsatsen, og den betaler for den mange gange.

Hvad skal jeg gøre næste

For en Kentino-bygget server, der går live i denne uge:

  1. Stil den virtuelle styringsmaskine eller servicenoden op. En 4-core / 8 GB boks er rigeligt. Installer Docker. Drop prometheus + grafana + alertmanager + loki komponere ovenfor.
  2. Installer på GPU-værten nvidia-container-toolkit (For L02) og verificere docker run --rm --gpus all nvidia/cuda:13.0.0-base-ubuntu24.04 nvidia-smi fungerer.
  3. Implementer dcgm-exporter, node-exporter, ipmi-exporter, smartctl-exporterog promtail på GPU-værten. Bekræft hver /metrics slutpunktet returnerer data.
  4. Ret Prometheus mod alle fem eksportørmål plus din vLLM /metrics slutpunkt. Genindlæs (curl -X POST :9090/-/reload).
  5. Importér Grafana-dashboards 12239 og 1860. Bekræft, at GPU- og systempanelerne er udfyldt.
  6. Send Alertmanager til din e-mail eller Slack-modtager. Udløs en syntetisk alarm med amtool. Hvis testalarmen ikke ankommer, gør der heller ingen rigtig en.
  7. Kør en stressende arbejdsbyrde (gpu-burn i en time, eller en rigtig træningstur) og hold øje med dashboards. Det er her, du opdager, at dit rum ikke kan holde GPU'er under 80 °C, at din NVMe er flaskehalsen, eller at din KV-cache er for lille – alt sammen ting, der er nemmere at fikse på dag ét end i uge tre.

Ledsagende artikler: L01 om driver-pinning, L02 om CUDA og container-runtime, L03 om kerne-tuning, L04 om valg af filsystem.

Overvåg først. Indstil derefter. Alt andet er gætværk.


Dette er en del af Kentino Wiki, en referenceserie om AI-beregning, robotteknologi og de systemer, der forbinder dem. Kommentarer og rettelser er velkomne på info@kentino.com.