Repository navigation
Engine aborts itself every 60 s during a prompt prefill: 24 stall reports in 10 days (0.1.44.1, 0.1.45, 0.1.48), 23 minidumps attached #3979
Description
Title: Engine aborts itself every 60 s during a prompt prefill: 24 stall reports in 10 days (0.1.44.1, 0.1.45, 0.1.48), 23 minidumps attached
Hi - this is a Windows/RTX 4090 box running 0.1.48 (CUDA 13 build) on Qwen3.8-Flash-Next UD-Q4_K_XL. Since
2026-10-15 the issue #29 watchdog has fired 24 times: 1 on 0.1.44.1, 14 on 0.1.45, 9 on 0.1.48, so it
is neither new nor fixed by the upgrade. Twenty-three minidumps are attached (md5 in the description below).
What the stall always looks like - the only two things true in all 24 reports:
strata serve: no progress for 60 s during a request (reading the prompt (batched): layer 1 of the prompt
chunk from token 241482) - stopping the engine so the server starts it again (issue #29)
strata serve: stall report (engine 0.1.48): ... for 60 s; 0 layers served since the last beat
expert pool: epoch 100, batch epoch 100: 48 of 48 jobs claimed, 48 done; 15 of 15 workers parked, 15 sleeping
memory: 75978 MiB resident, 105141 MiB committed, 19384 MiB RAM available; 42340014 page faults so far
2 s later:
expert pool: epoch 100, batch epoch 100: 48 of 48 jobs claimed, 48 done; ... 42345784 page faults so far
strata: released the verify window's GPU waits (#267): the GPU finished in 0 ms
0 layers served since the last beatin 24 / 24,- and the
expert pool:line is identical in the two samples 2 s apart in 24 / 24 - the epoch never
advances, so no new layer work is being claimed, while the GPU reports nothing pending.
Two shapes. (A) 10/24 report the GPU rang 0 and 0 of 0 jobs claimed in 8 of them; 9 of all 24 have no
completed prompt in that process at all - the engine dies on the first prompt it ever computes, aged 3-14
min. (B) 14/24 report the GPU rang 48 after up to 56 h of good service, with the last verify window at
positions 252 ... 421,121 tokens.
Already ruled out (numbers in the report): not commit space (19-22 GiB RAM available, 105-106 of 223.8 GiB
committed at death); not the RAM conversation cache (9 kills happened with --conversation-cache-mib 0 and
zero cache lines in those runs); not the MTP/verify path (shape A never ran a window); not a full card as a
cause (VRAM free when this request began was 0 MiB in only 2 of 24 - though 10 were under 1 GiB); and not a
context limit, because it is not deterministic: the same engine served a 438,055-token prompt at 2,115
tok/s minutes before stalling at chunk from token 151370 of a 315,199-token conversation, and after a
restart the same binary/config read 308454 = 36682 reused + 271772 read in 263446 ms and generated 5,496
tokens without stalling.
Three questions:
-
Between
48 of 48 jobs claimed, 48 donefor the layer andlayer N served, what is the prompt loop
waiting on? In every one of these 24 dumps the CPU pool shows the last epoch fully done and unchanging,
the GPU has nothing pending, and the layer counter never moves. The stacks should name it - could someone
symbolisestrata-stall-47896.dmpandstrata-stall-50560.dmp(0.1.48) first? -
Does the [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 allowance ever engage on Windows in 0.1.48? It printed 3 times in 24 and the process
died 11-16 s later each time (71/76/72 s without a step) although the line promises up to 600 s. For those
three that is explicable - their fault rate was 8-12/s, andPageFaultCount >> 3is then 1-2/s, below the
a >= io_last + 16gate. But kill 34218 (2026-10-24 22:51:41) reports 5,770 page faults in the 2 s
between its own two samples - about 360/s after>>3, comfortably over the gate - and printed no
allowance line before aborting. Isfile_tier_activity()on Windows actually reading the process's page
faults in 0.1.48, or onlyIO_COUNTERS.ReadTransferCount? -
Is the
--vram-reserve-mibreserve accounted before or after theVRAM free when this request began
reading? Two requests started at 0 MiB free with--vram-reserve-mib 1800set, and the report's own text
says a card that full can page GPU memory to system RAM.
Why this costs a lot here: the abort is the recovery, not the problem - serve restarts the engine in
66-82 s - but the empty prompt cache afterwards forces the client to re-read the whole conversation cold
(421534 = 0 reused + 134986 of 421534 read in 216498 ms), which is the path that hangs again. So one hang
turns into a burst: 14:30, 14:34, 14:42 and 22:30, 22:42, 22:51 on 2026-10-24.
Attachments (md5 list and the exact config are in the campaign folder described below): 23 minidumps,
442-465 KB each, strata-stall-<pid>.dmp, 2026-10-20 to 2026-10-24; the full verbatim text of all 24 stall
reports; a per-report table of the fields above; and a 2 s sampler CSV that caught one death (commit 151.5 to
119.7 GiB in a single sample).
Machine: Windows 11 build 26300, i9-14900KF (no AVX-512), 128 GiB RAM, RTX 4090 24 GiB (driver 616.92) with a
desktop full of GPU contexts, plus a GTX 1660 Ti for strata-vision.exe. Engine md5
1984bc5ee7049a118dd63ca04e53ff7f. Config = 38 arguments: --max-context 524288 --kv int8 --kv-resident 32768 --expert-cache 4608 (per layer) --pcie-frac 0.0 --vram-reserve-mib 1800 --ple-io direct --conversation-cache-mib 0 --mtp .../mtp/rt --spec 4 --spec-min-p 0.5; STRATA_WATCHDOG_S /
STRATA_WATCHDOG_IO_S unset (defaults 60 s / 600 s); engine env also carries STRATA_MMQ_KQ=1 STRATA_HC_Q8=1 STRATA_ADAPT_OVERLAP=1 STRATA_PREFILL_STREAM_MIN=4096 STRATA_PREFILL_CPU_SHARE=auto STRATA_MMVQ_IL=0.
Full method, per-report tables, every count and the limitations (no debugger, so no symbolised stack here) are
in bench/results/2026-10-24-win4090-prefill-hang-0148/README.md.
strata-stall-44072.dmp
strata-stall-44600.dmp
strata-stall-46592.dmp
strata-stall-47144.dmp
strata-stall-47896.dmp
strata-stall-50560.dmp
strata-stall-51160.dmp
strata-stall-55896.dmp
strata-stall-56292.dmp
strata-stall-57008.dmp
strata-stall-2172.dmp
strata-stall-3216.dmp
strata-stall-6004.dmp
strata-stall-14112.dmp
strata-stall-19548.dmp
strata-stall-23080.dmp
strata-stall-26072.dmp
strata-stall-27212.dmp
strata-stall-38416.dmp
strata-stall-38696.dmp
strata-stall-40064.dmp
strata-stall-40948.dmp
strata-stall-43024.dmp
Activity
github-actions commentedon Oct 24, 2026
Thanks for the issue. To keep the tracker readable, every item needs an area prefix in the title and the parts of the issue form filled in. This one is missing:
Edit the issue (title and description) and this note goes away on its own. If it is still missing parts in 5 days it will be closed, which is not a rejection: fix it and comment
/reopen.Details: CONTRIBUTING.md
PiccataPro commentedon Oct 26, 2026
Still reproduces on 0.1.50
Two RTX 3080 20 GiB (GA102-200, PCI 10de:2206), Windows 11 WDDM, driver 610.88 (CUDA UMD 13.3), 128 GiB.
VERSIONfile says 0.1.49.1, commitc33fa7ba; the stall headers self-report0.1.48(Oct 24) and0.1.50(Oct 25/26).Four watchdog kills in ~4.2 days (2026-10-24 → 10-26), 4,683 requests served. Same invariant you found:
0 layers served since the last finished stepin 4/4, andhost idle for 61594 / 170900 / 64134 / 68699 ms.A distinction I have not seen in the other reports: they split 2 + 2 by an independent signal
nvlddmkmevents within ±60 slayer 1 of the prompt chunk from token 16384layer 1 of the prompt chunk from token 16384layer 23 of the prompt chunk from token 41812layer 23 of the prompt chunk from token 63642Clean 4/4 in both directions. So these are two different bugs sharing one symptom:
Class A (
layer 1, ×2) — disk, not GPU. The engine warns about exactly this at every start:Recorded across restarts: 313 / 333 / 3756 / 3914 / 4401 / 4608 / 4670 / 4734 / 5682 rows/s (1–23 MB/s). The drive is a DRAM-less ZHITAI Ti600 with 170 GB free of 932 (82% full). Both stalls land on
token 16384, exactly the--prefill auto:16384chunk boundary. I have not tried--ple-io mmapyet.Class B (
layer 23, ×2) — GPU. This is the one that matters for #3979.Supporting your "not a full card" conclusion
out of memory/cudaErrorMemoryAllocation/failed to allocate/insufficient memory— four patterns, zero hits).nvidia-smi1,254 / 1,456 MiB; the engine's own figures at load 825 MiB (CUDA0) / 637 MiB (CUDA1).--pipeline-windows 2reserve 272 MiB.Answering your question 3 about
--vram-reserve-mibOn this box
VRAM free when this request began: 683 MiBappears byte-identically in all four stall reports — including the two with zero GPU involvement. It is a comparison against--vram-reserve-mib 1024, which this config has never met (it loads at 637–825 MiB), and the companion lineWARNING: only … MiB of VRAM free at the start of this request (below 1024 MiB)fires 72 times in this log. I read it as a standing condition, not a discriminator, and I would not use it as the reserve accounting you are probing for.Cross-link to #3801: same hand-off, same driver signature
#3801 (
--pipeline-windows 2, RTX 3080 Ti + V100, Windows/WDDM) is the closest match and it is currently closed without a fix. Three things line up exactly:nvlddmkmIDs 13, 14, and 153" — identical to ours.STATUS_INSUFFICIENT_RESOURCES) and vanished fromnvidia-smi. On 2026-10-26 11:57 we got the escalated version of that same state: a0x116 VIDEO_TDR_ERRORwith parameter 3 =0xC000009A(STATUS_INSUFFICIENT_RESOURCES), preceded byggml_cuda_init: failed to initialize CUDA: no CUDA-capable device is detectedafter a 53-token prompt degraded to 2.5 tok/s.cudaStreamSynchronize(m.cs)". With--layer-split 23the CUDA0 stage is exactly layers 0–22, so ourlayer 23stall is the same hand-off seen from the other side — we never see layer 23 start, they never see the stage-0 copy finish.Both of us run
--pipeline-windows 2. #3801's reporter disabled pipelining in production. Given how cheap the test is: is dropping--pipeline-windows 2still the recommended mitigation on Windows/WDDM for a two-card split, or does 0.1.50 contain work that makes the pipelined hand-off safe?Artifacts
strata-stall-18080.dmp— 2026-10-26 13:57, 26,459 bytesstrata-stall-12868.dmp— 2026-10-25 23:40, 26,459 bytes (identical size)C:\Windows\Minidump\102626-10390-01.dmp— the 0x116Two notes for whoever triages: across 3 faults in 4,683 requests, every one is in a data-movement / dequantisation kernel (
copy_i32×2,iq_dequant_gu_f16×1), never in a math kernel. And one earlier instance (2026-10-25 21:09) died with two faults in a row (copy_i32: illegal memory accesstheniq_dequant_gu_f16: illegal memory access) without ever tripping the 60 s watchdog — a context-wide failure rather than a wedge.