From 78d742c712375b6f6fac19d7703b2f1dfe47ef68 Mon Sep 17 00:00:00 2001 From: henrygd Date: Thu, 8 Jan 2026 13:14:32 -0500 Subject: [PATCH] web: refactor gpu code for slighly better perf --- .../site/src/components/routes/system.tsx | 127 ++++++++++-------- 1 file changed, 73 insertions(+), 54 deletions(-) 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}` + }} + /> + + )} +
+ ) + })} )}