dcgm-exporter.enabled, and restrict it to GPU nodes. See
Configuration.
What is measured
Three measurements carry the fleet view:
Sixteen further signals are collected alongside them. Health: temperature,
memory temperature, XID errors, correctable and uncorrectable remapped rows,
row-remap failure. Throughput: SM clock, memory clock, total energy, PCIe
transmit and receive bytes. Work: encoder, decoder and memory-copy utilisation,
SM active, SM occupancy.
Units to watch
Total energy is millijoules as the card reports it. The chartable series divides by 1000, so that one is joules. The stored report keeps the raw millijoules. Read the unit off whichever of the two you have in front of you. A cross-check from the verification cluster: 13,299 J over 5 minutes is 44.3 W, against a measured 48.6 W draw on the same card. PCIe transmit and receive bytes are a byte count over the sampling window DCGM used, and the sample carries no interval. Dividing it by a time produces a meaningless number. It is not a rate, and it is not a counter either. Three consecutive scrapes of one L4 read 1,705,867, then 1,705,867, then 1,675,230, so the value can fall.Not every card reports every signal
Which signals appear depends on the accelerator. Measured across three live exporters:- No profiling signals appear on the base exporter at all. They come from the separate profiling DaemonSet covered later.
- Remapped rows and row-remap failure appeared only on the L4.
- The MIG-partitioned A100 reported no overall GPU utilisation, and no encoder, decoder or memory-copy utilisation.
- The T4 refuses profiling outright, so its profiling pod crash-loops and its profiling signals are absent.
unsupported state, rather than as a
zero reading. Live: the A100 reported 45 C, while the L4 and the T4 reported 0
and were filtered out.
How an unmeasured card is reported
An idle accelerator and an unmeasurable one look identical if absence is rendered as 0%. CostGraph reports the state of each measurement instead of a number it cannot read. Each of the nineteen signals carries its own state:capacity_unknown is confined to the three measurements expressed as a ratio:
utilisation, framebuffer memory and power. The other sixteen signals have no
capacity to divide by, so they report supported, unsupported or no_data.
How to read each one:
no_datais a collection problem. Check that the exporter is running and scheduled on that node.unsupportedis the hardware, and no configuration changes it.capacity_unknownis still usable. The raw measurement arrives, in mebibytes for memory and watts for power, so you can read the value even though a percentage would be a guess.supportedis the only state that gives a percentage.
MIG-partitioned cards
On a card carved into MIG partitions:- Slices report no overall GPU utilisation. SM active and SM occupancy are the utilisation signals a slice has, and both come from the profiling exporter covered in the following section.
- Card-scoped values, meaning power, energy and temperature, describe the whole card. Where a card emits one copy per slice, summing them charges one card’s draw several times over. The queries collapse them, so a seven-slice A100 is not billed seven times its energy. Treat that as a hazard the queries guard against, rather than as something you are sure to see. The A100 on the verification cluster emitted one series per field, carrying no partition label at all.
- Slices carry no namespace, pod, or container label. Per-workload attribution on a MIG slice is limited as a result: the partition is visible, the workload holding it is not.
Opt-in profiling counters
SM active, SM occupancy and the PCIe byte counts are profiling counters. They need a second DCGM exporter reading only those counters. The chart deploys it as its own DaemonSet,dcgmProfiling.enabled, off by default.
It is a separate DaemonSet for a reason. The profiling module is not a
per-field opt-out: the exporter watches the whole counter set or exits. Some
accelerators refuse profiling at the driver level. Asking the shared exporter
for a profiling counter on such a card kills that exporter outright, so the
node loses utilisation, memory and power too. A DaemonSet also rolls node by
node, so the refusing pod stalls the rollout for every other GPU in the
fleet.
Which cards serve profiling is discoverable only at runtime, not from a model
list. On a four-node cluster measured this week, L4 and A100-MIG nodes accepted
profiling and a T4 node refused it with:
dcgmProfiling.nodeSelector if you would rather it not schedule there at all.
Accelerator usage in the product
Container usage can be viewed per accelerator dimension, not only cpu and memory: overall GPU utilisation, SM active, SM occupancy, framebuffer memory, and memory-copy utilisation. For overall GPU utilisation the request and the limit are the whole devices the container holds. Accelerators are requested as whole integer devices, and Kubernetes requires the request and the limit to be equal. There is therefore no fractional right-sizing. The only move is a different number of whole cards, or a differently carved card.Accelerator cost
Accelerator spend is reported two ways, and they are not the same number:- Month to date covers only the hours elapsed since the start of the current UTC month, and excludes any hours before the card was first seen.
- Projected month is what a whole month at the current fleet and rates would come to. It is a projection, not spend so far.
Configuration
The exporter values, including
dcgm-exporter and dcgmProfiling.