Runbook: GPU Health Monitor DCGM Connectivity Failures
Runbook: GPU Health Monitor DCGM Connectivity Failures
Overview
GPU health monitor requires connection to NVIDIA DCGM for all GPU health checks. Connectivity failures prevent GPU monitoring entirely on affected nodes.
Key points:
- DCGM comes from one of three sources, set by
global.dcgm.mode: the GPU Operator service, an external node-local hostengine, or an in-process embedded hostengine - Failures generate
GpuDcgmConnectivityFailurenode condition - Complete loss of GPU health monitoring on affected node
Symptoms
- Node condition
GpuDcgmConnectivityFailurepresent - GPU monitor logs show DCGM connection errors
If there is no GPU Health Monitor pod on the node at all, this runbook does not apply. A missing pod is a scheduling problem, not a connectivity problem — go to No Monitor Pod on the Node.
Procedure
1. Check GPU Monitor Logs
Look for:
"Error getting DCGM handle""DCGM connectivity failure detected""Failed to connect to DCGM"
2. Identify the DCGM Source Mode
Read the configured mode from the release. This is the authoritative answer:
The mode is operator-service (the default), external-hostengine, or embedded-mode. To confirm what the pod actually runs, read its arguments:
--dcgm-mode tells you which family the pod is in, and --dcgm-addr separates the two remote modes:
Then diagnose against the source the mode actually uses:
operator-service— continue to step 3. The DCGM pod and service are the dependency.external-hostengine— skip step 3. No DCGM pod exists. Check the externally managednv-hostengineon the node instead, and confirm the monitor pod hashostNetwork: truesolocalhostresolves in the host network namespace.embedded-mode— skip step 3. The hostengine runs inside the monitor container, so a connectivity failure points at the container’s own GPU and driver access. ConfirmruntimeClassNamenames the cluster’s NVIDIA RuntimeClass and that the container is privileged.
3. Verify DCGM Pod Running (operator-service only)
DCGM pod must be Running on the same node as the failing GPU monitor.
4. Test DCGM Connectivity
Test DCGM connectivity from within the gpu-health-monitor pod:
In embedded-mode the monitor starts the hostengine in-process and exposes it on pod-local loopback, so dcgmi inside this pod reaches that same engine. A failure here is node-local rather than a broken network hop, but it does not by itself say which part failed: the hostengine may not have started, or it started and cannot reach the GPUs because the driver, RuntimeClass, or container runtime is not giving the pod device access. The checks below separate the two.
If dcgmi produces no output at all and cannot be interrupted with Ctrl-C, stop here and go to Unresponsive DCGM — the probe is hung rather than unreachable, and every further query will hang the same way.
If DCGM commands fail, check the items for your mode:
-
operator-service— the configured DCGM service exists, and network policies allow traffic from the nvsentinel namespace to the one hosting it. Derive the Service name and namespace from--dcgm-addrrather than assuming the default: -
external-hostengine—nv-hostengineis running on the node and listening on the configured port; the monitor pod hashostNetwork: true; a host firewall does not block the port. -
embedded-mode—runtimeClassNamenames the cluster’s NVIDIA RuntimeClass; the container is privileged;nvidia-smi -Linside the pod lists the GPUs. Without GPU and driver injection the embedded engine cannot start.
5. Verify Resolution
No Monitor Pod on the Node
A node with no GPU Health Monitor pod produces no connectivity failure, because no process is there to report one. The node reports no GPU health at all, and nothing in the stack flags it.
Compare the monitor pods against the GPU nodes:
Every GPU node needs nvsentinel.dgxc.nvidia.com/dcgm.version set to 3.x or 4.x. The monitor DaemonSets select on it in all three source modes, so an unlabeled node is never a scheduling target. The DaemonSet stays healthy and reports no error, because Kubernetes never places a pod there to fail.
Which mode you run decides whether that is a bug or the expected setup step:
-
operator-service— labeler derives the label from the GPU Operator DCGM pod image. A missing label means labeler could not read a usable DCGM pod for that node, which is not the same as the pod being absent. Check in this order:requireDCGMReadyForBootstrapdefaults totrue, so on a node bootstrapping for the first time labeler withholds the label until the DCGM pod reports Ready. A pod stuckRunningbut not Ready produces exactly this symptom. Once the bootstrap annotation is written, labeler sets the label regardless of later readiness. See labeler. -
external-hostengineandembedded-mode— there is no DCGM pod, so labeler cannot derive the version and never creates the label. You supply it. See DCGM Version Node Label.
Also check that the node is not opted out. Labeler removes its detection labels from a node labeled nvsentinel.dgxc.nvidia.com/managed=false:
Unresponsive DCGM
A different failure mode from the above: instead of refusing the connection, a DCGM probe stops answering. Callers can park indefinitely, and the query never returns an error. In embedded mode this is node-local but not yet proof of a kernel-driver wedge — DCGM userspace deadlock can look the same. The node may keep reporting Ready with every GPU allocatable and no taint, so it continues accepting work that then fails to start.
Symptoms:
- Node condition
GpuDcgmUnresponsive, error codeDCGM_PROBE_HANGin embedded mode (whenprobeStoreOnlyis false; otherwise the event is stored/metric-only) - Remote modes use
GpuDcgmConnectivityFailure/DCGM_PROBE_HANGwithCONTACT_SUPPORT, because an endpoint or network hang does not prove that this node needs a reboot - Metric
dcgm_probe_hangsincremented for the hungoperation_name - GPU monitor logs:
"has not returned after Ns ... treating the DCGM probe as unresponsive" - Two common on-node shapes for the same underlying fault:
dcgm-exporterstaysRunningwith/healthgreen while scrapes fail (up==0for hours/days, no new log lines after “Listening on”)- Or GPU containers fail to start with
context deadline exceeded/StartErrorexit 128, while the node itself remainsReadywith GPUs allocatable
- Do not use
NotReady/unreachablealone to exclude this failure mode. A node can becomeNotReady/unreachableafter the monitor has already started and recorded a hang; verify the monitor pod was running and checkdcgm_probe_hangs/GpuDcgmUnresponsiveevidence before dismissing it. Ordinary kubelet death with no monitor activity is a different failure class.
Confirm with a bounded nvidia-smi probe (always use timeout — an unbounded hang can leave another unkillable D-state process):
Resolution: reboot the node. Whether the hang is a wedged driver or DCGM userspace holding driver locks, the stuck processes typically cannot be cleared short of a reboot.
The check ships observe-only, so by default it records the fault and leaves the reboot to you. Where probeStoreOnly has been set to false, the monitor requests the reboot itself: the event’s RESTART_BM action becomes a RebootNode CR once node-drainer has evicted the workloads.
If the condition never appeared, either the watchdog is disabled (dcgm.probeDeadlineSeconds: 0), or its deadline is late enough that the liveness probe restarted the container before the event was published. Check for a restart loop on the monitor pod with no accompanying node condition, and compare probeDeadlineSeconds against the liveness budget described in probeDeadlineSeconds.