Skip to content

Commit 4b534eb

Browse files
committed
Ledger (78): this node's intra-node MPI wait degraded 4.4x during the session -- it explains the drift, the unusable step column and probably the np16 hang, and the wait-free gather column was immune
1 parent e36a680 commit 4b534eb

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

docs/documentation/amr_action_plan.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,57 @@ possible while AMR aborts on the target machine at 1 rank, and every increment b
226226
on a compiler that does not reproduce it. It also means the ladder should add a CCE arm as soon as one
227227
exists, or the same class of breakage will keep accumulating undetected.
228228

229+
## 2026-09-05 (78) — THE NODE'S INTRA-NODE MPI WAIT DEGRADED 4.4x DURING THE SESSION: it explains the "drift", the unusable step column, and probably the np=16 hang -- and the gather column was immune
230+
231+
Four things went wrong after the fused-pack merge, and they turn out to be one thing.
232+
233+
**The measurement.** Same pinned binary, same deck, same node (k004-002), same flag-OFF arm, differenced steady
234+
window, with **identical call counts throughout** (`regrid` 0.05/step, `rb:gath` 11.55/step):
235+
236+
| flag-OFF arm, in time order | `w:regrid` | `regrid` phase | `w:TOTAL` |
237+
| A/B reps 1-6, 02:45-03:30 | 0.2135 | 0.3535 | 0.5844 |
238+
| memmgr sweep, manager disabled, 05:43-06:50 | 0.2182 | 0.4337 | 0.6186 |
239+
| memmgr sweep, manager default, 05:43-06:50 | 0.4102 | 0.6929 | 0.7389 |
240+
| recheck, 09:00-09:19 | **0.9487** | **1.2986** | **1.3488** |
241+
242+
The whole step went 2.388 -> 3.370 s/step and **every bit of the +0.98 is `regrid`, and within `regrid` it is WAIT**:
243+
`mg:wait` 0.124 -> 0.544, `rb:wait` 0.087 -> 0.399, unbracketed residual unchanged at 0.021 -> 0.022, `rhs`, `gather`,
244+
`coarse`, `seam`, `swap` all flat. Same calls, same bytes, same answers -- the ranks simply wait 4.4x longer. At np=8
245+
this is intra-node, so it is not the cross-node fabric that killed k004-004/005. No competing SLURM job ran on the
246+
node at any point (checked live), and `GPU_LOCK` was held throughout.
247+
248+
**What it explains.** (i) Ledger 76's "this node drifts 9.6 percent" -- that was the early, mild phase of this.
249+
(ii) Ledger 77's whole-step relative sd of 9.4-17.5 percent -- not random noise but a monotone slide.
250+
(iii) The np=16 hang of job 405909, where ranks spun at 100 percent CPU in MPI progress with every GPU idle: the same
251+
degradation an order worse and cross-node. It remains unproven, but "MPI on this machine got 4.4x slower over six
252+
hours" is a much better-supported explanation than a latent deadlock in our AMR exchanges, and the earlier framing
253+
overweighted the code.
254+
255+
**What it does NOT touch, and why that matters.** `gather` non-wait -- phase minus its two MPI-wait rows -- reads
256+
0.2230 (A/B, 6 reps), 0.2253 (memmgr, 3 reps), 0.224 (ledger 74, a DIFFERENT binary) and 0.277-adjacent only where
257+
wait is included. It is wait-free by construction, so it was immune to the whole slide. **This is the mechanism behind
258+
ledger 77's rule**: on a degrading node, price an increment on a wait-free phase, because the step and every
259+
wait-bearing row track the environment rather than the code. Ledger 75's -0.14 s/step whole-step figure was taken in
260+
the healthy window (`w:regrid` 0.2135, matching the session's best) and stands, but the robust number for that
261+
increment is and always was the -0.134 on gather non-wait.
262+
263+
**A confound in my own ledger-77 design, disclosed.** The 2x2 ran all manager-disabled cells before all
264+
manager-default cells within each rep, so the default cells sat systematically later in a degrading node -- not
265+
counterbalanced. Its conclusion (the allocator setting recovers 7 percent of what the flag recovers) rests on the
266+
wait-free gather column and so survives; had it rested on the step column it would be void. Counterbalance arm order
267+
in every future sweep.
268+
269+
**The filesystem event, and a near-miss worth recording.** `/work1` (WekaFS, not Lustre -- `lfs` does not exist here)
270+
hit ENOSPC at 08:58 with `amr-bench` at 1.1 TB, of which 477 GB was regenerable `restart_data`. 200 GB was freed and
271+
writes resumed. The near-miss: a Python `open(path, "w")` on the plan document truncated it to **0 bytes** before the
272+
write failed, and only `git checkout` saved 5,166 lines of ledger. **Never truncate a file in place on a filesystem
273+
that may be full -- write a temp file and rename.** Freeing the space did NOT restore performance, which is how the
274+
disk-consumption hypothesis was falsified and the MPI-wait measurement above was found instead.
275+
276+
**Standing rule this earns: a canary before any timing sweep.** One short flag-OFF arm, read `w:regrid` against the
277+
0.2135 baseline recorded here; if it is inflated, do not measure -- the step column will be environment, not code.
278+
That check costs about a minute and would have saved most of the wasted node time in this session's second half.
279+
229280
## 2026-09-05 (77) — FALSIFIED, MY OWN HYPOTHESIS: the allocator setting recovers 7 percent of what the fused packs recover, so the per-map cost is the MAP, not the malloc
230281

231282
Ledger 75 hedged its ~151 us/dispatch constant on `LIBOMPTARGET_MEMORY_MANAGER_THRESHOLD=0`, this bench's standing

0 commit comments

Comments
 (0)