diff --git a/internal/site/src/components/routes/system.tsx b/internal/site/src/components/routes/system.tsx
index 53e87919..3dc646a2 100644
--- a/internal/site/src/components/routes/system.tsx
+++ b/internal/site/src/components/routes/system.tsx
@@ -400,16 +400,34 @@ export default memo(function SystemDetail({ id }: { id: string }) {
const containerFilterBar = containerData.length ? : null
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
- const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {})
- const hasGpuData = lastGpuVals.length > 0
- const hasGpuPowerData = systemStats.some((record) => {
- const gpus = record.stats?.g
- if (!gpus) {
- return false
+ const lastGpus = systemStats.at(-1)?.stats?.g
+
+ let hasGpuData = false
+ let hasGpuEnginesData = false
+ let hasGpuPowerData = false
+
+ if (lastGpus) {
+ // check if there are any GPUs with engines
+ for (const id in lastGpus) {
+ hasGpuData = true
+ if (lastGpus[id].e !== undefined) {
+ hasGpuEnginesData = true
+ break
+ }
}
- return Object.values(gpus).some((gpu) => gpu.p !== undefined || gpu.pp !== undefined)
- })
- const hasGpuEnginesData = lastGpuVals.some((gpu) => gpu.e !== undefined)
+ // check if there are any GPUs with power data
+ for (let i = 0; i < systemStats.length && !hasGpuPowerData; i++) {
+ const gpus = systemStats[i].stats?.g
+ if (!gpus) continue
+ for (const id in gpus) {
+ if (gpus[id].p !== undefined || gpus[id].pp !== undefined) {
+ hasGpuPowerData = true
+ break
+ }
+ }
+ }
+ }
+
const isLinux = !(details?.os ?? system.info?.os)
const isPodman = details?.podman ?? system.info?.p ?? false
@@ -721,64 +739,65 @@ export default memo(function SystemDetail({ id }: { id: string }) {
)}
- {Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
- const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
- return (
-
-
- stats?.g?.[id]?.u ?? 0,
- color: 1,
- opacity: 0.35,
- },
- ]}
- tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
- contentFormatter={({ value }) => `${decimalString(value)}%`}
- />
-
-
- {(gpu.mt ?? 0) > 0 && (
+ {lastGpus &&
+ Object.keys(lastGpus).map((id) => {
+ const gpu = lastGpus[id] as GPUData
+ return (
+
stats?.g?.[id]?.mu ?? 0,
- color: 2,
- opacity: 0.25,
+ dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
+ color: 1,
+ opacity: 0.35,
},
]}
- max={gpu.mt}
- tickFormatter={(val) => {
- const { value, unit } = formatBytes(val, false, Unit.Bytes, true)
- return `${toFixedFloat(value, value >= 10 ? 0 : 1)} ${unit}`
- }}
- contentFormatter={({ value }) => {
- const { value: convertedValue, unit } = formatBytes(value, false, Unit.Bytes, true)
- return `${decimalString(convertedValue)} ${unit}`
- }}
+ tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
+ contentFormatter={({ value }) => `${decimalString(value)}%`}
/>
- )}
-
- )
- })}
+
+ {(gpu.mt ?? 0) > 0 && (
+
+ stats?.g?.[id]?.mu ?? 0,
+ color: 2,
+ opacity: 0.25,
+ },
+ ]}
+ max={gpu.mt}
+ tickFormatter={(val) => {
+ const { value, unit } = formatBytes(val, false, Unit.Bytes, true)
+ return `${toFixedFloat(value, value >= 10 ? 0 : 1)} ${unit}`
+ }}
+ contentFormatter={({ value }) => {
+ const { value: convertedValue, unit } = formatBytes(value, false, Unit.Bytes, true)
+ return `${decimalString(convertedValue)} ${unit}`
+ }}
+ />
+
+ )}
+
+ )
+ })}
)}