Most NVMe monitoring collects a handful of SMART counters and stops there. That works until a controller hangs without touching SMART, a PCIe link silently retrains to half speed, or a drive sets a critical warning bit that your single blanket alert treats as noise. NVMe failures rarely arrive as a clean “disk error.” They arrive as latency, throttling, stalled queues, or a device that vanishes from the bus.
Scope: local PCIe-attached NVMe devices (M.2, U.2, U.3, EDSFF). NVMe-oF, ZNS, and SPDK userspace configurations have different monitoring models and are out of scope.
The checklist is four maturity levels. Adopt Level 1 everywhere, Level 2 on anything serving production traffic, and Levels 3 and 4 where NVMe is on the critical path. Each signal lists its source and the severity it deserves.
flowchart TD PCIe[PCIe transport layer] -->|AER counters, link speed and width via sysfs| Host Ctrl[NVMe controller] -->|SMART log 0x02: critical_warning, spare, temp, errors| Host Ctrl -->|state via /sys/class/nvme/nvmeX/state| Host Media[NAND flash media] -->|media errors, spare consumption| Ctrl Host[Host monitoring] --> Alerts[Alerting: PAGE / TICKET / PLAN]
Level 1: survival
The minimum to know the drive is alive and not refusing I/O.
- Controller state is
live. The single most direct availability signal. Read/sys/class/nvme/nvmeX/state; expected values includelive,resetting,connecting,deleting,dead, andnew. Any non-livestate sustained more than 30 seconds in production is a PAGE. Briefresettingduring a host-initiated reset (driver reload, firmware activation) is expected; sustained states are not. This is not innvme smart-logand most metrics agents do not collect it. - Critical warning bit 3 (read-only mode). The drive has placed its media in read-only mode; all writes are rejected. This is a binary hardware fault, typically spare block exhaustion. PAGE unconditionally. Manual check:
nvme smart-log /dev/nvme0 | grep critical_warningand test for bit 3 (0x08). - Device presence.
/dev/nvme*accessible,/sys/class/nvme/populated. Disappearance means PCIe loss, fatal uncorrectable error, or physical failure. PAGE.
Level 2: operational
What anyone running NVMe in production should be embarrassed to miss. This level turns SMART data into per-bit alerts with correct severity.
- Per-bit critical warning alerts. Do not alert on
critical_warning != 0as one blanket rule. The bits have different severity and response:- Bit 0 (available spare below threshold): TICKET. A replacement signal, not a 3 a.m. emergency. The drive still works.
- Bit 1 (temperature threshold exceeded): TICKET alone, since WCTEMP can trip transiently under sustained load. Escalate to PAGE if sustained over 5 minutes AND
critical_comp_timeis actively increasing. - Bit 2 (NVM subsystem reliability degraded): TICKET alone (vendor definitions vary, and drives past 100% endurance can set this while still functional). PAGE when combined with a rising
media_errorsrate. - Bit 3 (read-only): PAGE, always.
- Bit 4 (volatile memory backup failed): TICKET. The drive works, but in-flight writes are now unprotected against power loss. Consumer drives without PLP never set this bit.
- Media errors rate.
media_errorsis a lifetime counter of uncorrectable data integrity failures. TICKET on any rate of increase above zero; PAGE when paired with critical warning bit 2. Rate of change is the actionable signal, not the absolute value. Single-digit errors over years on enterprise drives can be within tolerance. - Percentage used (endurance). A monotonically increasing counter that can exceed 100%. PLAN at > 80% (procure), TICKET at > 90% (schedule swap). Never PAGE on this alone; the real failure signals have their own alerts. A rate above roughly 1% per week suggests write amplification problems or a workload mismatched to the drive class.
- Available spare vs spare threshold. When
avail_spareapproachesspare_thresh(typically 10%, vendor-dependent), the drive is running out of good blocks. Warning at or below 2x threshold, critical at or below threshold. Track the consumption rate: spare depletion accelerates non-linearly, and the last 10% goes much faster than the first. - Composite temperature. NVMe controllers throttle at vendor-defined thresholds (WCTEMP/CCTEMP), and throttling looks like “the application got slow” with zero errors. Typical WCTEMP is around 70-85C depending on drive class; the actual values live in Identify Controller data (
nvme id-ctrl), not the SMART log, so do not hardcode universal thresholds. Watch the trend and correlate with throughput. - Unsafe shutdowns rate. Each increment is a power event without proper shutdown notification. On drives without power-loss protection, each one carries data loss risk. TICKET on any increase during normal operation; investigate power infrastructure, not the drive.
Level 3: mature
Leading indicators and composite patterns. This is where you catch failures weeks early instead of minutes.
- Warning and critical composite temperature time. Cumulative minutes above WCTEMP and CCTEMP. A rate of change above zero means the drive is spending time in thermal stress even if you missed the live event. Some drives do not implement these counters (always 0).
- Thermal management transitions.
thm_temp1_trans_countandthm_temp2_trans_countcount entries into light and heavy throttling. Rising transition counts with normal-looking current temperature means chronic undercooling. - Error log entries rate.
num_err_log_entriescovers more than media errors: admin command errors, I/O command errors, internal faults. A rising rate without rising media errors points at firmware or driver issues. Readnvme error-log /dev/nvme0early; the log is circular and high error rates overwrite root cause. - Controller busy time vs host throughput.
controller_busy_time(minutes resolution) compared against power-on time gives internal utilization. High busy time with low host IOPS means the controller is burning cycles on garbage collection, remapping, or throttling. Rough rule: busy ratio above 90% with low delivered IOPS means a sick drive. - Available spare consumption trajectory. Fit a rate to the spare decline and project the threshold crossing. Accelerating consumption is one of the strongest failure predictors NVMe gives you.
- PCIe AER error counters. See the next section; these live in sysfs, not SMART.
Level 4: expert
The signals operators add after their third storage incident.
- PCIe link speed/width degradation detection, continuously, not just at provisioning.
- Per-namespace I/O statistics on multi-namespace drives, where one namespace’s abuse can starve the others.
- Latency distribution (p99/p99.9 via eBPF or blktrace). Block layer stats only give averages, and NVMe mean latency is almost always fine; the 10ms tail outliers are what break SLAs.
- Vendor-specific log pages (0xC0-0xCF) for DRAM cache state, GC duty cycle, and NAND write counts. This is the only way to estimate true write amplification;
data_units_writtencounts host-visible writes, not NAND writes. - Firmware version tracking across the fleet, so vendor advisories map to actual drives.
The signals most collectors miss
The Level 1 controller state check and the entire PCIe transport layer do not come from the NVMe SMART log. Netdata’s nvme collector, for example, covers endurance, available spare, composite temperature, I/O volume, power cycles, critical warnings, unsafe shutdowns, media errors, and power-on time, but not controller state, PCIe AER, link negotiation, or controller resets. Those need sysfs and dmesg:
# Controller state (PAGE if not "live" for >30s)
cat /sys/class/nvme/nvme0/state
# PCIe AER counters (any sustained non-zero rate is abnormal)
cat /sys/class/nvme/nvme0/device/aer_dev_correctable
cat /sys/class/nvme/nvme0/device/aer_dev_fatal
cat /sys/class/nvme/nvme0/device/aer_dev_nonfatal
# Link negotiation: current should match max
cat /sys/class/nvme/nvme0/device/current_link_speed
cat /sys/class/nvme/nvme0/device/max_link_speed
cat /sys/class/nvme/nvme0/device/current_link_width
cat /sys/class/nvme/nvme0/device/max_link_width
# Controller resets and timeouts (TICKET on one, PAGE on 2+ per hour)
dmesg | grep -i "nvme.*reset\|nvme.*timeout"
Why each matters:
- Controller state: a controller stuck in
resettingis a firmware crash or PCIe problem in progress.deadmeans the kernel gave up. - AER counters: correctable errors (RxErr, BadTLP, BadDLLP) mean marginal signal integrity; they are silently retransmitted, so there is no data loss, but latency suffers. Uncorrectable errors are severe. In healthy systems these counters are zero; AER is the correct source for transport errors. Root access is typically required, and containers may not see sysfs.
- Link speed/width: a Gen4 x4 drive retrained to Gen3 x2 delivers one quarter of its bandwidth with zero errors anywhere. Compare current against max; any mismatch is a TICKET. Check for deliberate bifurcation before assuming a fault.
- Controller resets: each reset is a 5-30 second I/O stall that cascades into application timeouts. Host-initiated resets (driver reload, VM reboot) are expected; repeated spontaneous resets are a dying controller or firmware bug.
What most teams get wrong
- One blanket alert for
critical_warning != 0. Bit 3 is an outage, bit 0 is a procurement task. Per-bit severity is the whole point. - Ignoring NVMe temperature while monitoring CPU temperature. An M.2 drive can throttle a database to half speed while every other metric looks healthy.
- Missing the PCIe transport layer. A slightly loose connector causes thousands of retransmissions and 10x latency while SMART reports perfect health.
- No unsafe shutdown alerting, because “the server came back fine.” The corruption shows up later at the filesystem or application layer.
- Treating
data_units_writtenas NAND writes. True write amplification requires vendor-specific telemetry; SMART-only math underestimates wear. - Not baselining PLP capability at provisioning. Consumer drives without power-loss protection look identical to enterprise drives in SMART until the first power event.
How Netdata helps
- Netdata’s nvme collector polls the SMART/Health log and exposes the critical warning bitmask as individual dimensions in
nvme.device_critical_warnings_state, so you can alert per bit with the severity split this checklist describes instead of one noisy rule. nvme.device_media_errors_rateandnvme.device_error_log_entries_rateconvert lifetime counters into rates, which is the actionable form; correlating a media error rate increase with critical warning bit 2 is the PAGE condition for active media degradation.nvme.device_estimated_endurance_perc,nvme.device_available_spare_perc, andnvme.device_composite_temperaturegive the endurance, spare, and thermal trends for Levels 2 and 3, including spare consumption trajectory.nvme.device_unsafe_shutdowns_countmakes power events visible as a rate, and the warning/critical composite temperature time charts catch thermal stress you missed live.- The gaps are explicit: controller state, PCIe AER counters, link speed/width, and controller resets are not in the nvme collector. Pair Netdata with sysfs scraping and kernel log monitoring for the Level 1 availability signal and the transport layer.
Related guides
- How NVMe actually works in production: a mental model for operators
- NVMe monitoring maturity model: from survival to expert
- nvme nvme0: I/O timeout, Resetting controller: what an NVMe controller reset means
- blk_update_request: I/O error, dev nvme0n1: reading NVMe I/O errors in the kernel log
- NVMe device disappeared: nvme0: Removing and a drive that fell off the PCIe bus
- NVMe controller state not live: reading resetting, deleting, and dead from sysfs
- NVMe controller reset loop: repeated resets from a firmware hang
- NVMe critical_warning is nonzero: decoding the SMART critical warning bitmask
- NVMe drive in read-only mode: critical warning bit 3 and rejected writes
- NVMe available spare below threshold: critical warning bit 0 and end-of-life wear
- NVMe temperature threshold exceeded: critical warning bit 1, WCTEMP, and CCTEMP
- NVMe NVM subsystem reliability degraded: critical warning bit 2






