Skip to content

[gfx1200, 2x RX 9060 XT layer split] prompt-read stalls (watchdog #29 aborts) + run-to-run prefill degradation: fresh prompts slow 3-4x mid-run, file tier re-reads 24-35 GB per request #1407

Closed as not planned

Description

@Iokkeh2025

[gfx1200, 2x RX 9060 XT layer split] prompt-read stalls (watchdog #29 aborts) + run-to-run prefill degradation: fresh prompts slow 3-4x mid-run, file tier re-reads 24-35 GB per request

Environment

Engine v0.1.40.2, self-built, backend: hip, archs: [gfx1200]
ROCm 10.1.0-3 (gfx1200), HIP 7.16.26385, clang 24.0.0git
GPUs 2x RX 9060 XT 16 GB, --layer-split auto (0-23 / 24-47)
Host Ryzen 5 4600G (6C/12T), 32 GB DDR4, no swap, kernel 7.0.0-38
Model Qwen3.8-Flash-Next IQ2_XS, ~39 GB experts, --mmap-experts
hipBLASLt self-tuned gfx1200-hipblaslt-100401.txt, log confirms tuning enabled (26 rows, version 100401) — table pairing is not the issue

Flags: --expert-cache auto --prefill auto --spec 4 --spec-min-p 0.5 --mtp --max-context 65536 --kv q4_0 --mmap-experts --vram-reserve-mib 1024 --layer-split auto
Env: STRATA_HIPBLASLT_TUNING, STRATA_GR_V3=1, later STRATA_IO_PREFETCH=1 STRATA_IO_STATS=1

  1. Prompt-read stalls (Critical bug + Performance report RTX 4090 #29 watchdog abort)

Fresh 4K-38K prompts: the progress line freezes mid-chunk, the watchdog kills the engine:

[strata] reading the prompt: 16,384 of 38,830 tokens, 495 s so far <- unchanged for 100+ s
strata serve: no progress for 60 s during a request (reading the prompt (batched):
layer 34 of the prompt chunk from token 0) ... (issue #29) -> exit -6

While frozen: both GPUs at 100% busy, 3 threads in D state at lock_mm_and_find_vma, 2 at kfd_wait_on_events, MemAvailable ~17 GB (no OOM). One run also hit verify: timed out at layer 8 (#267); an earlier pre-0.1.40.2 run wedged fully (empty HTTP reply, needed a kill). Freezes only ever occurred during the prompt pass, never decode.

With STRATA_IO_PREFETCH=1 a full bench completed with no stalls (one data point — the prefetch path may be bypassing the fault storm).

  1. File tier re-reads tens of GB per request (STRATA_IO_STATS)

file tier I/O this request: the OS read 34,889.1 MB from storage (255,655 major faults)
for 89,694.7 MB of expert reads
file tier I/O this request: the OS read 24,306.9 MB ... page cache held 0.0 MB at the read
io prefetch: 917 read ahead (1329.3 MB by pread), 0 used, 0 unused

page cache held 0.0 MB even though ~17-20 GB is reclaimable — layer evictions (FADV_DONTNEED) make every request cold; 562 GB cumulative read for ~40 requests. Also 0 used / 0 unused for read-ahead looks like consumed preads aren't accounted for.

  1. Prefill degrades within a run (same binary, same config)

bench_prefill.py, back-to-back, engine otherwise idle:

trial prompt prefill decode
1 4,210 75.5 tok/s 16.9
2 8,830 87.5 tok/s 21.0
3 4,210 22.2 5.5
4 8,830 33.5 34.9

Directional, not random: first two prompts fast, last two 3-4x slower. Follow-ups inherit it — 114-tok follow-up after a 4,210 fresh = 56-59 tok/s, after an 8,830 fresh = 15-17 tok/s. A large fresh prompt seems to leave the file tier re-streaming what it just evicted.

Ruled out

OOM (none in journalctl), NVMe errors (SMART pass, 1.5 GB/s reads), GPU Xid/HSA errors (none in dmesg), VRAM exhaustion (~890 MiB free at load), hipBLASLt table mismatch (confirmed loaded each start).

Notes

  • ReBAR aperture is 256 MB (board DSDT zeroes the windows; local issue — mentioned only because the mmap fault path is what a small aperture penalizes)
  • card0's memory clock sits at 96 MHz while DPM reads high mid-request (card1 stays at 1258 MHz); it does climb under full load

Questions

  1. When the prompt pass stalls at lock_mm_and_find_vma, is the watchdog catching the fault storm itself or a real hang?
  2. Is page cache held 0.0 MB expected with --mmap-experts + FADV_DONTNEED evictions?
  3. Are consumed prefetch preads miscounted (0 used, 0 unused)?

Happy to run A/B cells o

Activity

  1. added 2 commits that reference this issue on Oct 8, 2026
  2. Niko1221 commented on Oct 8, 2026

    @Niko1221
    Owner

    Thanks, this is a useful report. What we can say:

    1. Q1 (watchdog): threads in D state at lock_mm_and_find_vma with both GPUs busy and MemAvailable at 17 GB look like a fault storm on the mmap file tier, not a hang: the pool and the GPUs wait on page faults that read 24-35 GB per request. The Critical bug + Performance report RTX 4090 #29 watchdog only watches the heartbeat, so a slow step looks stuck. In 0.1.41 the watchdog also watches the OS's major-fault count and bytes read: while they keep growing it waits up to 10x the limit (STRATA_WATCHDOG_IO_S, 0 turns it off) and prints a line saying so. A real hang still stops at the old limit.
    2. Q2 (page cache 0.0 MB): with 39 GB of experts and 17-20 GB reclaimable the kernel can keep only part of the file, so each request starts mostly cold. As far as we can see this path does not call FADV_DONTNEED per layer (that is only in the resident-complement build); the cache is smaller than the working set.
    3. Q3: we have not looked at the 0 used / 0 unused counters yet; consumed preads should be counted, so that one stays open.

    For 32 GB of RAM with a 39 GB mmap pack, your own finding is the cheapest fix: STRATA_IO_PREFETCH=1. We have not added a startup recommendation for it. Could you retest on 0.1.41 with STRATA_IO_STATS=1, with and without STRATA_IO_PREFETCH=1, 3+ interleaved runs of the 4,210 / 8,830-token trials?

  3. Iokkeh2025 commented on Oct 8, 2026

    @Iokkeh2025
    Author

    A/B test results: STRATA_IO_PREFETCH on/off, v0.1.41, 32 GB RAM

    Tested on v0.1.41 with STRATA_IO_STATS=1, 3 interleaved runs of 4,210 / 8,830-token prompts, engine otherwise idle. All 18 runs completed with zero crashes.

    trial 1 (cold) trials 2-4 (warm)
    IO_PREFETCH=1 59-134 tok/s 606-655 tok/s
    IO_PREFETCH unset 78-134 tok/s 598-654 tok/s

    Conclusion: IO_PREFETCH provides NO measurable benefit on this system. The on/off numbers are statistically identical across all 3 runs.

    What actually fixed the stalls: the 0.1.41 watchdog change. The old watchdog killed the engine during slow prompt reads (fault storm on the mmap file tier). The new watchdog watches major-fault count and bytes read, and waits up to 10x the limit while they grow. With that fix, the same hardware that was crashing every 4-8 requests now completes 18 consecutive runs without a single crash.

    Recommendation: do not add a startup recommendation for IO_PREFETCH on 32 GB systems — it does not help. The watchdog fix in 0.1.41 is the real solution.

    Testing note for users: close all other applications before benchmarking Strata. The best-case scenario is to SSH into the Strata server machine from a phone or laptop, leaving the server machine fully dedicated to the engine. Running a desktop session, browser, or other GPU/RAM-consuming apps alongside Strata will materially affect results.

  4. Vop3p commented on Oct 9, 2026

    @Vop3p
    Contributor

    On the stall half of this (not the RAM re-read half, which I have no data on): the same symptom on a 2x RX 6900 XT (gfx1030) layer split - the #29 watchdog firing while reading a long prompt, expert pool idle - traced to the GPU's GFX power gating interacting with the adaptive expert swaps' SDMA copies (#884). Two things that made it go away there, both cheap to try on gfx1200:

    If either one changes your stall rate, that would say whether the gfx1200 stall is the same animal.

    Developed with an AI coding assistant; every number above was measured on 2x RX 6900 XT (gfx1030, PCIe 4.0 x8 each) / Ryzen 5 5600X, ROCm 10.0.

  5. added a commit that references this issue on Oct 11, 2026
  6. Niko1221 commented on Oct 13, 2026

    @Niko1221
    Owner

    Thanks for the report. To keep the tracker current we are closing issues older than three days: 0.1.44 is out with a long list of fixes, and many older reports are covered by it or by 0.1.43.1.

    If this still happens on 0.1.44, please leave a comment here with your engine log (and the version line it prints), and we will reopen it. A new issue that links this one works too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions