Back to the NVMe SMART Decoder
Sources
NVMe SMART Decoder reads what a drive reports about itself and explains it. This file says where each field, unit, bit meaning, threshold and number on the page comes from. Field layouts and meanings come from the NVMe specification. The OK, Watch and Attention cut-offs are this tool’s own rules of thumb, as the page says. The example drive and example controller are made up. Items the sources do not settle are listed under “Open items”. Checked on 2026-10-15 against the saved copies named below.
The specification
- NVM Express Base Specification, revision 2.4 (ratified 2026-07-31), Figure 213, SMART / Health Information Log Page
(log page identifier 02h). The page’s byte map and field notes were re-checked against it:
- Byte 00, Critical Warning: bit 0 available spare below threshold, bit 1 a temperature at or past an over or under temperature threshold, bit 2 reliability degraded, bit 3 all media read-only, bit 4 volatile memory backup failed, bit 5 Persistent Memory Region read-only, bit 6 indeterminate personality state. Bit 0 is set when the spare falls below the threshold, which is why the tool calls a spare sitting exactly on its threshold “Watch”, not “Attention”.
- Bytes 02:01, Composite Temperature, in Kelvins. How it is computed is implementation specific and it “may not represent the actual temperature of any physical point”. A raw 0 K is shown as not reported.
- Byte 03, Available Spare, and byte 04, Available Spare Threshold: normalized percentages from 0% to 100%.
- Byte 05, Percentage Used: a vendor specific estimate, allowed to exceed 100, with values above 254 shown as 255, updated once per power-on hour. A value of 100 means the estimated endurance is used, “but may not indicate an NVM subsystem failure”. This is the source of the page’s “it can pass 100 and the drive may keep working”.
- Byte 06, Endurance Group Critical Warning Summary.
- Bytes 47:32 and 63:48, Data Units Read and Written: counted in thousands of 512-byte units and rounded up, so one unit is 512,000 bytes and the converted figure can be high by up to that much. They count host data and exclude metadata, which is why the page says host writes are not flash writes. A 0 means not reported.
- Bytes 127:112 Power Cycles, 143:128 Power On Hours (which “may not include” time in a non-operational power state), 159:144 Unexpected Power Losses, 175:160 Media and Data Integrity Errors (uncorrectable ECC, CRC failures and LBA tag mismatches), 191:176 Error Information Log Entries.
- Bytes 195:192 and 199:196, minutes at the warning and at the critical composite temperature.
- Bytes 215:200, Temperature Sensors 1 to 8, two bytes each, in Kelvins.
- Bytes 219:216 to 231:228, Thermal Management Temperature 1 and 2 transition counts and total seconds.
- The 16-byte counters are 128-bit values; the tool keeps them as exact BigInt values.
- Revision 2.4 renamed bytes 159:144 from Unsafe Shutdowns to Unexpected Power Losses (“Note that this field was previously named Unsafe Shutdowns”). The page keeps the older name, which smartctl and nvme-cli still print.
- The same specification, Figure 338, Identify Controller Data Structure (CNS 01h, 4,096 bytes):
- Bytes 267:266 WCTEMP and 269:268 CCTEMP, the warning and critical composite temperature thresholds in Kelvins. WCTEMP is “an overheating condition during which controller operation continues”; the specification recommends reporting 0157h for it (343 K, about 70 °C). CCTEMP marks a critical condition that may stop normal operation.
- Byte 263, NPSS: the number of power states, a 0’s based value, from 1 up to 32 power states.
- Bytes 521:520, ONCS, a 16-bit field; bit 2 says the controller supports the NVM Command Set Dataset Management command, which is the command behind TRIM.
- Bytes 2079:2048 to 3071:3040, Power State 0 to 31 Descriptors, 32 bytes each (Figure 340): maximum power with its scale (0.01 W or 0.0001 W), idle and active power with their scales, entry and exit latency, the non-operational flag (a non-operational state does not process I/O commands) and the relative read throughput, read latency, write throughput and write latency ranks.
- The Active Power Workload hints: workload 1 is an extended idle period with a burst of random writes, and workload 2 is heavy sequential writes.
- The README says the Identify Controller layout was cross-checked against libnvme’s
struct nvme_id_ctrl. libnvme is not saved in the Flash Library; the offsets above are from the specification, which is.
Tools and commands
- smartctl(8), smartmontools manual page (saved copy from the Debian manpages). Used for:
-x(all information),-j/--json,--scanand the device type-d nvme;/dev/nvme0style names for NVMe drives. The Windows pathC:\Program Files\smartmontools\bin\smartctl.exe, thewinget install smartmontoolspackage name and the/dev/sdastyle names smartctl gives NVMe drives on Windows are not in that copy and were not checked against a saved source. - nvme-cli documentation for
nvme smart-logandnvme id-ctrl(master and 2.11, saved). Used for:-o jsonoutput and-b(raw binary). Thenvme get-log --log-id=2 --log-len=512 -bform is not in a saved copy. - Units by tool: smartctl JSON reports temperatures in Celsius and
nvme smart-log -o jsonin Kelvin. That is what the real files in the test corpus show. Seetest/corpus/real/SOURCES.mdfor every file and where it came from.
Endurance numbers
- Jonmichael Hands, “Endurance of NVMe, SAS, and SATA SSDs”, SNIA Solid State Drive Special Interest Group white paper (saved). Used for: TBW and drive writes per day are the two endurance ratings, and DWPD = TBW / 365 / warranty years / capacity. The tool takes TBW, capacity and warranty from the user and shows used %, remaining TB, the average write rate, projected life and rated against observed DWPD. Capacity is in decimal units: 1TB is 1,000GB.
The tool’s own rules of thumb
| Value | Setting | Source |
|---|---|---|
| Temperature | Watch at 70 °C, Attention at 80 °C | The tool’s own cut-offs. The specification recommends a WCTEMP of 343 K (about 70 °C); each drive reports its own WCTEMP and CCTEMP |
| Available spare | Watch within 10 points of the threshold, Attention below it | The tool’s own. Bit 0 of Critical Warning is set below the threshold |
| Percentage Used | Watch at 80, Attention at 100 | The tool’s own |
| Unexpected power losses | Watch at 10 or more and at least a quarter of power cycles | The tool’s own |
| Media errors, Critical Warning, critical temperature time | Attention at any non-zero value | The tool’s own |
| Warning temperature time, error log entries | Watch at any non-zero value | The tool’s own |
| Input limit | 1,000,000 characters or bytes, 1MB files | Implementation limit, not a claim |
Made-up and outside data
- The example drive (41 °C, 100% spare, 9% used, 118,204,771 data units written, 7,212 power-on hours, and with a 600TB rating on a 1,000GB drive 10.09% used, 539.5TB remaining, 0.201 observed and 0.329 rated DWPD) and the example controller are invented. The page says so.
- The test corpus is 61 real logs from public sources, scrubbed of identifiers;
test/corpus/real/SOURCES.mdlists each one with its URL and licence. No real raw hex dump or raw Identify Controller dump was found, so those paths have synthetic fixtures only.
Existing site wording the tool stays consistent with
- TRIM Check: NVMe carries TRIM as Dataset Management, and ONCS bit 2 says the drive supports it. Neither tool can show that a system sends it.
Open items for Sean
- The specification now calls bytes 159:144 Unexpected Power Losses. The page could show both names.
- Celsius in smartctl JSON and Kelvin in nvme-cli JSON rest on the corpus files, not on either tool’s documentation.
- libnvme’s
struct nvme_id_ctrland the nvme-cliget-logpage are not saved. Neither is needed for a claim on the page, since the specification is saved. - The Windows install steps (the
wingetpackage name, the smartctl install path and the/dev/sdadevice names) have no saved source. A smartmontools Windows page or a savedsmartctl --scanoutput would cover them.