mirror of
https://github.com/henrygd/beszel.git
synced 2026-03-21 21:26:16 +01:00
web: refactor gpu code for slighly better perf
This commit is contained in:
@@ -400,16 +400,34 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
|||||||
const containerFilterBar = containerData.length ? <FilterBar /> : null
|
const containerFilterBar = containerData.length ? <FilterBar /> : null
|
||||||
|
|
||||||
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
|
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
|
||||||
const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {})
|
const lastGpus = systemStats.at(-1)?.stats?.g
|
||||||
const hasGpuData = lastGpuVals.length > 0
|
|
||||||
const hasGpuPowerData = systemStats.some((record) => {
|
let hasGpuData = false
|
||||||
const gpus = record.stats?.g
|
let hasGpuEnginesData = false
|
||||||
if (!gpus) {
|
let hasGpuPowerData = false
|
||||||
return 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)
|
// check if there are any GPUs with power data
|
||||||
})
|
for (let i = 0; i < systemStats.length && !hasGpuPowerData; i++) {
|
||||||
const hasGpuEnginesData = lastGpuVals.some((gpu) => gpu.e !== undefined)
|
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 isLinux = !(details?.os ?? system.info?.os)
|
||||||
const isPodman = details?.podman ?? system.info?.p ?? false
|
const isPodman = details?.podman ?? system.info?.p ?? false
|
||||||
|
|
||||||
@@ -721,64 +739,65 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
|||||||
<GpuEnginesChart chartData={chartData} />
|
<GpuEnginesChart chartData={chartData} />
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
)}
|
)}
|
||||||
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
|
{lastGpus &&
|
||||||
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
|
Object.keys(lastGpus).map((id) => {
|
||||||
return (
|
const gpu = lastGpus[id] as GPUData
|
||||||
<div key={id} className="contents">
|
return (
|
||||||
<ChartCard
|
<div key={id} className="contents">
|
||||||
className={cn(grid && "!col-span-1")}
|
|
||||||
empty={dataEmpty}
|
|
||||||
grid={grid}
|
|
||||||
title={`${gpu.n} ${t`Usage`}`}
|
|
||||||
description={t`Average utilization of ${gpu.n}`}
|
|
||||||
>
|
|
||||||
<AreaChartDefault
|
|
||||||
chartData={chartData}
|
|
||||||
dataPoints={[
|
|
||||||
{
|
|
||||||
label: t`Usage`,
|
|
||||||
dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
|
|
||||||
color: 1,
|
|
||||||
opacity: 0.35,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
|
|
||||||
contentFormatter={({ value }) => `${decimalString(value)}%`}
|
|
||||||
/>
|
|
||||||
</ChartCard>
|
|
||||||
|
|
||||||
{(gpu.mt ?? 0) > 0 && (
|
|
||||||
<ChartCard
|
<ChartCard
|
||||||
|
className={cn(grid && "!col-span-1")}
|
||||||
empty={dataEmpty}
|
empty={dataEmpty}
|
||||||
grid={grid}
|
grid={grid}
|
||||||
title={`${gpu.n} VRAM`}
|
title={`${gpu.n} ${t`Usage`}`}
|
||||||
description={t`Precise utilization at the recorded time`}
|
description={t`Average utilization of ${gpu.n}`}
|
||||||
>
|
>
|
||||||
<AreaChartDefault
|
<AreaChartDefault
|
||||||
chartData={chartData}
|
chartData={chartData}
|
||||||
dataPoints={[
|
dataPoints={[
|
||||||
{
|
{
|
||||||
label: t`Usage`,
|
label: t`Usage`,
|
||||||
dataKey: ({ stats }) => stats?.g?.[id]?.mu ?? 0,
|
dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
|
||||||
color: 2,
|
color: 1,
|
||||||
opacity: 0.25,
|
opacity: 0.35,
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
max={gpu.mt}
|
tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
|
||||||
tickFormatter={(val) => {
|
contentFormatter={({ value }) => `${decimalString(value)}%`}
|
||||||
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}`
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
)}
|
|
||||||
</div>
|
{(gpu.mt ?? 0) > 0 && (
|
||||||
)
|
<ChartCard
|
||||||
})}
|
empty={dataEmpty}
|
||||||
|
grid={grid}
|
||||||
|
title={`${gpu.n} VRAM`}
|
||||||
|
description={t`Precise utilization at the recorded time`}
|
||||||
|
>
|
||||||
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t`Usage`,
|
||||||
|
dataKey: ({ stats }) => 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}`
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ChartCard>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user