log: frank-medium restored after orphaned merge-build server held both R9700s

This commit is contained in:
Frank
2026-09-18 12:29:36 -07:00
parent 59c76035d3
commit cfabe07959
+36
View File
@@ -905,3 +905,39 @@ timestamp: 2026-09-14
If you bench from an agent session, the session owes the fleet a
`health 200` before it ends. Consider making the bench harness
self-restoring.
## 2026-09-18 (midday) — frank-medium down: orphaned merge-build server held both R9700s
- **Symptom:** connection refused on `192.168.0.235:7770`. Unit was
`inactive`, `enabled`, unmasked (`/etc/systemd/system/frank-medium.service`
symlinked to the repo unit, not `/dev/null`), `NRestarts=0` — a clean
stop, not a crash.
- **Not the morning's case:** the GPUs were **not** idle. `rocm-smi` read
15.5 GiB on GPU0 and 17.1 GiB on GPU1. `ps` named the holder: PID
2519965, `llama-server` from `third_party/llamacpp/build-merge`
(gitignored scratch), orphaned at PPID 1, bound `127.0.0.1:17770`,
`-c 16384 --split-mode layer --tensor-split 1,1 -ngl 99 -t 16`.
- **Timeline (sudo journal + `/tmp/layersplit.log`):** `start` 08:14:02 →
`stop` 09:19:44 → merge build spawned 09:19:47 → log reached
`model loaded` / `listening` at 09:20 → nothing after. The merge-build
load validation passed; the cleanup-and-restore half never ran.
- **Why prod could not come back:** the 35:30 split needs ~30.8 GiB on
ROCm0 and ~28.9 on ROCm1. The stray owned roughly half of each card, so
`systemctl start` would have died on allocation, not on config.
- **Proof it was abandoned, not parked:** `/proc/<pid>/stat` utime+stime
identical across a 10 s sample (frozen CPU), zero established
connections to `:17770`, loopback-only bind, 3h05m since last log write.
- **Restore:** preserved the test log to `/tmp/layersplit.log.preserved-20260918`,
`kill 2519965` (exited in <1 s, both cards → 60 MiB baseline), then
`systemctl start frank-medium`. Health 503 → 200 in ~20 s (payload warm
in page cache). `/proc/MainPID/cmdline` confirms deployed geometry
(`--tensor-split 35,30`, ctx 393216, 2 slots, `--flash-attn on`,
`--spec-type draft-mtp`); steady state ROCm0 32.9 GiB / ROCm1 30.7 GiB.
Real completion returns verbatim with `reasoning_content` and
spec-decode engaged: `draft_n 39 / accepted 35` (89.7 %), tg 40.6 t/s.
Fingerprint `b11009-fb27a525d` = the pinned runtime.
- **Lesson:** "GPUs idle" is a check, not an assumption. A stopped prod
unit plus busy cards means something else took them — find the holder with
`ps`/`ss` and prove it abandoned (frozen CPU ticks, no conns) before
reclaiming. Scratch servers on loopback are invisible to the endpoint
monitor, so they strand the fleet instead of failing loudly.