feat(topo): per-socket bar layout with disks under their controller

Rework the /topo diagram from side-by-side stacked cards into one tall
vertical bar per CPU socket with everything attached to it branching off
sideways (socket 0 left/branches right, socket 1 right/branches left).

Disks are now parented under the storage controller they physically hang
off (SATA/AHCI, SAS HBA, RAID) — itself a NUMA-affine PCIe device under one
socket — instead of a synthetic catch-all node. The disk->controller link
is read from a new storage-controllers.txt techdump
(platform.StorageControllerMapScript, a /sys/block walk); disks with no
resolvable controller fall back to an "Other" bar. No board/root node.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SYjrG6bVmeG1Z2Wmc8kg3o
This commit is contained in:
Mikhail Chusavitin
2026-09-03 12:15:49 +03:00
co-authored by Claude Sonnet 5
parent b1ab866f58
commit 319f08ac4b
5 changed files with 634 additions and 100 deletions
+2 -1
View File
@@ -22,7 +22,8 @@ func techdumpBucketFor(name string) string {
return "cpu"
case name == "dmidecode-type17.txt":
return "memory"
case name == "lsblk.json", name == "storcli64-drives.json", name == "storcli2-show-all.json",
case name == "lsblk.json", name == "storage-controllers.txt", name == "storcli64-drives.json",
name == "storcli2-show-all.json",
strings.HasPrefix(name, "smartctl-"), strings.HasPrefix(name, "nvme-"):
return "storage"
case name == "nvidia-smi-q.txt", name == "nvidia-smi-query.csv", name == "nvidia-smi-conf-compute-q.txt",