Repository navigation
fix(gpu): raise nvidia-cdi-refresh TimeoutStartSec for multi-GPU nodes (GB300) - #9899
Conversation
Windows Unit Test Results 3 files 18 suites 1m 6s ⏱️ Results for commit 15ca828. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
🟢 Approval recommended
The narrow timeout change preserves existing failure handling, includes a focused regression assertion, and has no identified blocking issues.
No open issues 🎉
What changed in this PR
Raises the NVIDIA CDI refresh startup timeout to prevent slow GPU initialization on GB200/GB300 nodes from failing Linux node provisioning.
Changes:
- Adds a 300-second default timeout, configurable through
NVIDIA_CDI_REFRESH_TIMEOUT_START_SEC, while preserving existing exit-code handling. - Adds a ShellSpec assertion for the timeout written to the systemd drop-in.
| File | Description |
|---|---|
spec/parts/linux/cloud-init/artifacts/cse_config_gpu_spec.sh |
Verifies the drop-in includes TimeoutStartSec=300. |
parts/linux/cloud-init/artifacts/cse_config_gpu.sh |
Writes the configurable timeout and documents its purpose. |
Review effort: Balanced
fbcd60b to
1aee110
Compare
…well (GB300) nvidia-container-toolkit 1.20.1 (aks-gpu #177) regresses GB200/GB300 managed-driver provisioning. 1.19.1 left this Type=oneshot unit at systemd's oneshot default of TimeoutStartSec=infinity; 1.20.1 ships /usr/lib/systemd/system/nvidia-cdi-refresh.service.d/10-container-engines.conf which orders the container engines after it AND pins TimeoutStartSec=90s. On Grace-Blackwell the start is slow -- nvidia-ctk cdi generate ~81s over the arm64 Grace NVLink/nvml path plus a cold ~28s nvidia-smi -L precheck (>90s) -- so systemd SIGTERMs it. A timeout is result=timeout (SIGTERM), not a SuccessExitStatus code, so install.sh's `systemctl restart` still fails -> CSE exit 84 -> kubelet never starts -> node never joins. Write the TimeoutStartSec=300 override to a SEPARATE 90-aks-cdi-refresh-timeout drop-in (arm64 only). The 90- prefix is load-bearing: systemd merges drop-ins in lexical filename order (last wins), so the override must sort AFTER the toolkit's 10-container-engines.conf -- a 10-aks-* name sorts before it and loses (verified: TimeoutStartUSec stays 90s). Verified live on GB300 that the 90- drop-in raises TimeoutStartUSec 90s -> 5min. x86 generates in <1s (measured: 8x H200), so no override is written there. Overridable via NVIDIA_CDI_REFRESH_TIMEOUT_START_SEC.
1aee110 to
15ca828
Compare
|
✅ Validated live on real GB300 (abe2e, toolkit 1.20.1 + this fix)Ran the GB300 managed-DRA + compute-domain scenario in AgentBaker abe2e on a real GB300 rack (eastus2euap), with the exact toolkit that causes the regression (1.20.1) and this fix applied. Result: 5/5 GB300 nodes healthy and
Measured cold cdi-refresh start on GB300: ~137s (service journal: Negative control: the same path on 1.20.1 without this fix is So on real GB300, the regressing toolkit + this fix → managed driver + DRA + compute-domain all come up clean. |
3ffe873
into
main
Problem
GB200/GB300 managed-driver (
--gpu-driver Install) nodes fail to join (CSE exit 84, kubelet never starts) after theaks-gpu-cuda-ltsimage was built with nvidia-container-toolkit 1.20.1 (aks-gpu #177, first in image tag580.159.04-20261020182457).Root cause
nvidia-cdi-refresh.serviceisType=oneshot. Toolkit 1.19.1 left it at systemd's oneshot default ofTimeoutStartSec=infinity. 1.20.1 ships a new drop-in/usr/lib/systemd/system/nvidia-cdi-refresh.service.d/10-container-engines.confthat orders the container engines after the unit and pinsTimeoutStartSec=90s.On Grace-Blackwell the unit's start is slow:
nvidia-smi -Lprecheck: ~28s (cold, before persistence is warm)nvidia-ctk cdi generate: ~81s (enumerating the GPUs + driver libs/firmware over the arm64 Grace NVLink/nvml path)Total ~109s > 90s → systemd SIGTERMs it. A timeout is
result=timeout(SIGTERM), not an exit code, so the existingSuccessExitStatus=1 2 127drop-in can't cover it.install.sh's blockingsystemctl restart nvidia-cdi-refresh.servicethen returns non-zero → the aks-gpu install container exits non-zero → retried, but every retry now aborts atnvidia-installer(module already loaded, can't unload on a live GPU node) →retrycmdexhausts → CSE exit 84.Blast radius
Grace-Blackwell arm64 only (GB200/GB300). x86 is unaffected — measured on a live 8× H200:
nvidia-smi -L0.11s,cdi generate<1s (and on 1.19.1 the unit wasTimeoutStartSec=infinity).Fix
Write
TimeoutStartSec=300to a separate, higher-sorted drop-in90-aks-cdi-refresh-timeout.conf, arm64-gated (getCPUArch).The
90-prefix is load-bearing: systemd merges drop-ins in lexical filename order, last wins. The toolkit's10-container-engines.confsets 90s, and a10-aks-*name sorts before it (a<c) and loses — so the override must sort after it. (The existing10-aks-tolerate-generate-failure.confis left untouched forSuccessExitStatus; it doesn't conflict with ordering.)Verified live on a GB300 node: a
10-aks-*timeout drop-in leavesTimeoutStartUSec=1min 30s; the90-drop-in raises it to5min. x86 writes no override (stays at the 90s default). Overridable viaNVIDIA_CDI_REFRESH_TIMEOUT_START_SEC.Scope is intentionally limited to the timeout. The
components.jsonbump to the 1.20.1 image is the fleet-exposure event and must land with/after this fix.Testing
cse_config_gpu_spec.sh: 79/79 pass — arm64 asserts the90-drop-in exists withTimeoutStartSec=300(and the10-drop-in has no timeout); x86 asserts the90-drop-in is not written.shellcheckclean (no new findings).make generate/testdata churn — drop-ins are written at runtime, not rendered into customData.TimeoutStartUSec90s → 5min on a GB300 node.