fix(2.0): GPU-Metrik findet Strix-Halo-Card dynamisch (card1) + GTT
Real-Box-Befund: GPU ist card1 (nicht hardcoded card0), Connector-Dirs uebersprungen. Zusaetzlich GTT (echter Unified-Memory-Pool) statt nur VRAM-Carve-out. Frontend zeigt GTT bevorzugt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -23,16 +23,25 @@ def _read_int(path: str) -> int | None:
|
|||||||
|
|
||||||
|
|
||||||
def _gpu_sysfs() -> dict | None:
|
def _gpu_sysfs() -> dict | None:
|
||||||
"""AMD-GPU-Auslastung + VRAM via sysfs (Linux). None, wenn nicht vorhanden."""
|
"""AMD-GPU-Auslastung + Speicher via sysfs (Linux). Findet die Basis-Card
|
||||||
base = "/sys/class/drm/card0/device"
|
dynamisch (Strix Halo ist oft card1, nicht card0) und überspringt die
|
||||||
if not os.path.isdir(base):
|
Connector-Verzeichnisse (card1-DP-1 …). Strix Halo nutzt Unified Memory →
|
||||||
|
GTT ist der eigentliche große Pool; VRAM ist nur der kleine Carve-out."""
|
||||||
|
for dev in sorted(glob.glob("/sys/class/drm/card*/device")):
|
||||||
|
card = dev.split("/")[-2] # z.B. "card1" oder "card1-DP-1"
|
||||||
|
if "-" in card: # Connector-Dir → kein GPU-Device
|
||||||
|
continue
|
||||||
|
busy = _read_int(f"{dev}/gpu_busy_percent")
|
||||||
|
if busy is None:
|
||||||
|
continue
|
||||||
|
return {
|
||||||
|
"busy_percent": busy,
|
||||||
|
"vram_used": _read_int(f"{dev}/mem_info_vram_used"),
|
||||||
|
"vram_total": _read_int(f"{dev}/mem_info_vram_total"),
|
||||||
|
"gtt_used": _read_int(f"{dev}/mem_info_gtt_used"),
|
||||||
|
"gtt_total": _read_int(f"{dev}/mem_info_gtt_total"),
|
||||||
|
}
|
||||||
return None
|
return None
|
||||||
busy = _read_int(f"{base}/gpu_busy_percent")
|
|
||||||
vram_used = _read_int(f"{base}/mem_info_vram_used")
|
|
||||||
vram_total = _read_int(f"{base}/mem_info_vram_total")
|
|
||||||
if busy is None and vram_used is None:
|
|
||||||
return None
|
|
||||||
return {"busy_percent": busy, "vram_used": vram_used, "vram_total": vram_total}
|
|
||||||
|
|
||||||
|
|
||||||
def _temps() -> dict | None:
|
def _temps() -> dict | None:
|
||||||
|
|||||||
+6
-6
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
<meta name="theme-color" content="#0d1117" />
|
<meta name="theme-color" content="#0d1117" />
|
||||||
<link rel="manifest" href="/manifest.webmanifest" />
|
<link rel="manifest" href="/manifest.webmanifest" />
|
||||||
<title>Mission Control 2.0</title>
|
<title>Mission Control 2.0</title>
|
||||||
<script type="module" crossorigin src="/assets/index-BYe3GDjZ.js"></script>
|
<script type="module" crossorigin src="/assets/index-CDBFzDBf.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-CatWSvf4.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-CatWSvf4.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -83,7 +83,13 @@ export interface RoutingResp {
|
|||||||
export interface SystemStatus {
|
export interface SystemStatus {
|
||||||
cpu: { percent: number; cores: number | null }
|
cpu: { percent: number; cores: number | null }
|
||||||
ram: { total: number; used: number; percent: number }
|
ram: { total: number; used: number; percent: number }
|
||||||
gpu: { busy_percent: number | null; vram_used: number | null; vram_total: number | null } | null
|
gpu: {
|
||||||
|
busy_percent: number | null
|
||||||
|
vram_used: number | null
|
||||||
|
vram_total: number | null
|
||||||
|
gtt_used?: number | null
|
||||||
|
gtt_total?: number | null
|
||||||
|
} | null
|
||||||
temp: { cpu?: number; gpu?: number } | null
|
temp: { cpu?: number; gpu?: number } | null
|
||||||
disk: { total: number; used: number; percent: number } | null
|
disk: { total: number; used: number; percent: number } | null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,9 @@ export function SystemView() {
|
|||||||
label="GPU"
|
label="GPU"
|
||||||
percent={s.gpu.busy_percent}
|
percent={s.gpu.busy_percent}
|
||||||
detail={
|
detail={
|
||||||
s.gpu.vram_used != null && s.gpu.vram_total != null
|
s.gpu.gtt_used != null && s.gpu.gtt_total
|
||||||
|
? `${gb(s.gpu.gtt_used)} / ${gb(s.gpu.gtt_total)} GB (GTT/unified)`
|
||||||
|
: s.gpu.vram_used != null && s.gpu.vram_total
|
||||||
? `${gb(s.gpu.vram_used)} / ${gb(s.gpu.vram_total)} GB VRAM`
|
? `${gb(s.gpu.vram_used)} / ${gb(s.gpu.vram_total)} GB VRAM`
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user