feat(bench): attribute the loose-write residual — dir-scaling + splice I/O counters

sd_bench grows a directory-entry-scaling section (stat hit/miss and
the loose-object composite at 8/64/256 siblings): FAT resolves every
path component by linear scan, so cost climbing with N convicts
directory scans as the ~360ms residual; flat cost exonerates them.
stage_and_commit brackets the splice with the p_mmap counters and logs
'N mmaps / M KB read' per commit, splitting the residual into pack-read
I/O vs everything else on the next real :sync.
This commit is contained in:
Julien Calixte
2026-07-14 01:12:35 +02:00
parent a941ae39b3
commit 8c4866df1f
3 changed files with 66 additions and 4 deletions

View File

@@ -51,9 +51,15 @@ Sync performance — inherited from the
- [ ] Close the publish gap: 19.8 s today — the splice's 5.0 s and the ~7 s of
repo-open/negotiation overhead are the next curves
([tradeoff analysis](tradeoff-curves/sync-commit-staging.md)).
- [ ] Instrument the residual ~360 ms/loose-write (suspect: FAT directory-op
cost in the freshen/refresh path) — one `sd_bench` + `p_mmap`-miss
logging pass.
- [~] Instrument the residual ~360 ms/loose-write (suspect: FAT directory-op
cost in the freshen/refresh path) — **instrumentation BUILT 2026-07-14,
measurement run pending**: `sd_bench` grew a directory-entry-scaling
section (stat hit/miss + the loose-object composite at 8/64/256
siblings — FAT resolves paths by linear scan, so cost climbing with N
convicts dir scans; flash with `just flash-bench`), and `stage_and_commit`
now brackets the splice with the `p_mmap` counters, logging
`N mmaps / M KB read` per commit so the next real `:sync` splits the
residual into pack-read I/O vs everything else.
- [ ] The images-off-card lever
([notes/git-sync-images-and-repo-size.md](notes/git-sync-images-and-repo-size.md))
composes with the splice — decide whether to take it here.