#23206·netdata

Add an SMBIOS memory-device (DMI type 17) collector for per-DIMM inventory

Author: Ravid824Created Jul 21, 2026Updated Sep 16, 2026
Labelsfeature requestneeds triage

Problem

netdata's only per-module memory source today is the kernel EDAC subsystem (mem.edac_mc_dimm_*), which is an error-detection facility, not a hardware inventory. Used as one, it fails across a mixed fleet: it is missing entirely on hosts with no EDAC driver / non-ECC RAM /ECC disabled in BIOS; incomplete on others (enumerates only some DIMMs, e.g. a 504 GiB host reporting only 64 GiB); reports per rank instead of per physical stick (dual-rank 8x32 GB shows as 16x16 GB); and carries no DDR generation, manufacturer, or part number. The correct data exists on every machine in the BIOS SMBIOS memory-device (DMI type 17) records, but the agent never parses them, so most of a fleet ends up with missing or misleading per-DIMM info.

Description

Add a collector that parses the SMBIOS/DMI table type 17 ("Memory Device"), the same data dmidecode -t 17 reads from /sys/firmware/dmi/tables/, and exposes per DIMM as labels/node-metadata: size, slot/locator, memory type (DDR4/DDR5), speed, manufacturer, part number, and rank. This is the authoritative physical inventory the BIOS populates on essentially every machine, independent of ECC or EDAC drivers. netdata already reads the board/system slice of DMI (/sys/class/dmi/id/) for host labels, so this extends an existing capability, in-band, with no SSH and no BMC. Make it opt-in if reading the raw DMI table needs elevated permissions.

Importance

really want

Value proposition

...

Proposed implementation

Parse the raw SMBIOS/DMI table exposed by the kernel at /sys/firmware/dmi/tables/DMI (with /sys/firmware/dmi/tables/smbios_entry_point for the header), the same source dmidecode uses; fall back to /dev/mem on systems without the sysfs tables. Walk the structures and extract every Type 17 (Memory Device) record, skipping unpopulated slots (Size == 0). From each populated record read: Size, Locator/Bank Locator, Type (DDR4/DDR5/...), Speed/Configured Speed, Manufacturer, Part Number, Serial Number, and Rank. Expose these as per-DIMM labels / host metadata (one entry per Locator), mirroring how the existing /sys/class/dmi/id host-info labels are already collected. This can live in the same code path that reads /sys/class/dmi/id today (e.g. the system-info collection), so no new privileged access is introduced beyond reading the DMI tables (typically root-readable, 0400) - gate it behind a config option if elevated read of the raw table is required. No external tooling (no dmidecode binary dependency) is needed; the parser is a small, well-documented binary walk of the SMBIOS structure table