Operations troubleshooting — the layered triage playbook
Generic triage for GPU-cluster failures: hardware → kernel modules → userspace → app. Common error patterns table mapping symptoms to next steps.
help for the full list, or solutions for copy-paste fix recipes.When a tenant says "my training job is broken" or a pod is stuck ContainerCreating, you don't pick a fix at random. There's a layering you can walk: hardware, kernel modules, userspace tools, application. The lower layer being broken makes everything above it broken; verifying each layer in order isolates the actual cause within a few minutes.
This page is that playbook plus a table of common error messages mapped to likely causes and next steps.
The four layers
┌────────────────────────────────────┐
│ 4. Application │ trainer, NCCL, Slurm job
│ (logs, exit codes, stdout) │
├────────────────────────────────────┤
│ 3. Userspace tools │ nvidia-smi, ibstat, nvcc,
│ (binaries that talk to │ dmesg, journalctl
│ kernel and devices) │
├────────────────────────────────────┤
│ 2. Kernel modules / device files │ lsmod, /dev/nvidia*,
│ (the kernel side of drivers) │ /dev/infiniband/*
├────────────────────────────────────┤
│ 1. Hardware │ lspci, dmesg, smartctl,
│ (PCIe, link state, BIOS) │ nvme list
└────────────────────────────────────┘
Always start at the bottom. If the GPU isn't visible to lspci, no amount of kubectl describe pod is going to help.
Layer 1: Hardware
# All NVIDIA GPUs visible to PCIe?
lspci | grep -i nvidia
# 17:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# 31:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# 4b:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# 65:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# 97:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# c1:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# da:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# f4:00.0 3D controller: NVIDIA Corporation Device 2330 (rev a1)
# Expected count: matches the spec sheet (8 for an 8-GPU box).
# Missing: BIOS/POST issue, or hardware fault.
# All Mellanox NICs visible?
lspci | grep -i mellanox
# 19:00.0 Infiniband controller: Mellanox Technologies MT2910 ...
# ...
# PCIe link width and speed for a GPU
sudo lspci -vv -s 17:00.0 | grep -E 'LnkSta:|LnkCap:'
# LnkCap: Port #0, Speed 32GT/s (ok), Width x16 (ok), ASPM L1, ...
# LnkSta: Speed 32GT/s (ok), Width x16 (ok)
# LnkSta should be at LnkCap. Down-trained = bad slot, dirty connector, or BIOS.
# Recent hardware errors
dmesg -T | grep -iE 'error|fail|nvme|pcie|mce|edac' | tail -50
# Look for: "PCIe Bus Error", "AER" reports, NVMe controller resets,
# "Machine Check Exception" (mce), DIMM EDAC errors.
# NVMe drives
nvme list
sudo smartctl -a /dev/nvme0n1 | grep -E 'Critical|Available|Percentage|Temperature'
Red flags: GPU count short, link width below x16, AER errors, NVMe Critical Warning != 0x00, Machine Check Exceptions.
Layer 2: Kernel modules and device files
# NVIDIA driver loaded
lsmod | grep nvidia
# nvidia_peermem 16384 0
# nvidia_uvm 1646592 4
# nvidia_drm 122880 6
# nvidia_modeset 1310720 10 nvidia_drm
# nvidia 56631296 463 nvidia_uvm,nvidia_modeset
# Device files exist
ls -l /dev/nvidia*
# /dev/nvidia0 /dev/nvidia1 ... /dev/nvidia7
# /dev/nvidiactl /dev/nvidia-uvm /dev/nvidia-uvm-tools
# RDMA / IB
lsmod | grep -E 'mlx5|ib_'
# ib_uverbs 184320 3
# mlx5_ib 401408 0
# mlx5_core 2105344 1 mlx5_ib
# ...
ls -l /dev/infiniband/
# rdma_cm uverbs0 uverbs1 ...
# wekafs (if applicable)
lsmod | grep weka
cat /sys/module/wekafsio/refcnt 2>/dev/null
Red flags: missing nvidia_peermem (no GPUDirect RDMA), missing mlx5_ib (no RDMA at all), /dev/nvidia* device count mismatch with what lspci showed.
Layer 3: Userspace tools
# GPU runtime
nvidia-smi
# Driver Version, GPU count, memory, persistence mode.
# All eight GPUs at idle should report util=0%, mem~0, temp=30-40°C.
# GPU topology — which GPUs talk to which over what
nvidia-smi topo -m
# IB / RDMA
ibstat
# CA 'mlx5_0'
# Port 1:
# State: Active
# Physical state: LinkUp
# Base lid: 0x4
# LMC: 0
# Rate: 400
ibv_devinfo
# (more verbose, includes guid, fw version)
# NIC link state for Ethernet RDMA / IPoIB
ethtool ens14f0np0 | grep -E 'Speed|Link'
# Quick connectivity check between GPUs
nvidia-smi topo -p2p r
# Pairs marked OK or NS. NS on same-baseboard pair = ACS or topology issue.
# DCGM diagnostics — runs the canonical health suite
dcgmi diag -r 2
# Run level 2 (basic + memory + bandwidth tests). 3 = full (longer).
Red flags: nvidia-smi shows GPUs but topo -p2p is NS everywhere (ACS), ibstat shows INIT instead of Active (link down), DCGM diag reports failures on specific GPUs.
Layer 4: Application
# Pod side
kubectl -n <ns> describe pod <pod>
# Look at the Events section, image pull state, mounts, init container status.
kubectl -n <ns> logs <pod> -c <container> # current
kubectl -n <ns> logs <pod> -c <container> --previous # if it crashed and restarted
# Slurm side
kubectl -n <ns> exec login-0 -- squeue -j <jobid> -l
kubectl -n <ns> exec login-0 -- sacct -j <jobid> --format=JobID,JobName,State,ExitCode
# Inside a still-running container
kubectl -n <ns> exec -it <pod> -- bash
ulimit -a # confirm ulimits propagated
echo $LD_LIBRARY_PATH; echo $CUDA_HOME
nvidia-smi # works inside the container?
ibv_devinfo # RDMA visible inside the container?
Common error patterns table
| Symptom (error message) | Layer | Likely cause | Next step |
|---|---|---|---|
Pod stuck ContainerCreating with MountVolume.MountDevice failed: rpc error ... wrong fs type | 2/3 | Stale wekafs mount; kernel module won't reload | Weka troubleshooting |
nvidia-smi: NVML: Driver/library version mismatch | 2 | Kernel module version differs from libnvidia-ml | Reboot or rmmod nvidia* && modprobe |
ibv_reg_mr failed: Cannot allocate memory | 3 | RLIMIT_MEMLOCK not unlimited for the process | Ulimits fix |
OSError: [Errno 12] Cannot allocate memory (with free RAM) | 2 | vm.max_map_count too low | Sysctl fix |
OSError: [Errno 24] Too many open files | 2/3 | NOFILE ulimit not propagated to runtime | Ulimits four-place fix |
NCCL hangs at Connection refused between nodes | 1/3 | RDMA NIC link down OR firewall on TCP fallback | ibstat, then NCCL_SOCKET_IFNAME |
| NCCL multi-node all-reduce 4× slower than single-node | 3 | NUMA or NIC alignment wrong | NUMA pinning |
nvidia-smi topo -p2p shows NS for same-baseboard GPUs | 2 | PCIe ACS still on | ACS disable |
nvidia.com/gpu: 0 capacity on a node with GPUs | 3/2 | Device plugin can't load NVML | GPU Operator validation |
Init:CrashLoopBackOff cp: extra operand | 4 | ArgoCD SMP orphan field on init container | ArgoCD SMP fix |
| Long-uptime pods all rolling on a values.yaml change | 4 | Stale checksum/cm annotation drift | ArgoCD checksum drift |
Slurm node DOWN, slurmd logs say MUNGE auth fail | 3 | Time skew between nodes | chronyc tracking, sync NTP |
getent passwd alice returns nothing on login pod | 3 | nslcd down or LDAP outpost unreachable | Authentik |
Transport endpoint is not connected on /weka | 2 | Stale wekafs mount | Weka troubleshooting |
ibv_open_device failed: Permission denied | 4 | Container missing /dev/infiniband bind | Check pod securityContext + device-plugin |
| GPU temp climbing during idle, fan stuck | 1 | Hardware: thermal sensor / fan controller | Open RMA, drain workload off |
| ECC error count climbing, DBE / Xid 48 / Xid 79 | 1 | Hardware: GPU memory failure | Open RMA, drain workload off |
A standard triage flow
When a tenant reports "training is broken on gpu-01":
# 1. SSH to the node, check hardware first
ssh gpu-01
lspci | grep -i nvidia | wc -l # expected GPU count
dmesg -T | tail -100 | grep -iE 'error|xid|fault|aer'
# 2. Kernel modules
lsmod | grep -E 'nvidia|mlx5|weka'
# 3. Userspace
nvidia-smi
ibstat | grep -E 'Port|State'
# 4. Now the application — kubectl back at the workstation
kubectl -n tenant-foo describe pod <pod>
kubectl -n tenant-foo logs <pod> --previous | tail -200
Most issues resolve in this flow within 10 minutes. Hardware issues take longer because they involve coordinating with the datacenter or a vendor.
When the issue is "the cluster is slow today"
This is harder. Multi-node NCCL slowdown without a clear node-level failure usually traces to:
- Network path congestion — switch buffer drops, broken link in the spine. Pull switch counters.
- Shared FS saturation — Weka backend overwhelmed.
weka stats throughput. - One bad node dragging down a collective — find it by running
nccl-testson subsets. - Cross-tenant noisy neighbor if the tenants share fabric.
The nccl-tests ring-test approach: split the nodes in half, run all_reduce_perf on each half. Whichever half is slow, split again. Halves until you isolate the bad node.
Always-useful escalation data
When opening a ticket (Weka, NVIDIA, vendor), include:
- Output of
dmesg -T | tail -500(or full dmesg) lspci -tvandlspci -vvv -s <device>nvidia-bug-report.sh(NVIDIA collects everything)- For RDMA issues:
ibdiagnet -P all=1 -r --get_phy_info - For Weka:
weka diagnosticsfrom the affected client and from a backend host - Time range of the failure (UTC) and what changed in the previous 24 hours
See also
- ACS disable — common P2P fix
- Ulimits — RLIMIT_MEMLOCK + NOFILE
- Sysctl tuning — vm.max_map_count, inotify
- Weka troubleshooting — stale mounts
- ArgoCD — sync gotchas
- Incident response — when triage becomes incident
External:
- nvidia-bug-report.sh: ships with the driver
- DCGM diagnostics: developer.nvidia.com/dcgm
- Mellanox
ibdiagnet: docs.nvidia.com/networking/category/ofed