Server wedge: generation stalls mid-decode; /health OK but /slots hangs; process must be SIGKILLed
Summary
Under long-running load the server occasionally stops generating mid-decode:
print_timing lines cease, GPU utilization drops to 0%, the process stays alive,
/health still returns {"status":"ok"}, but /slots hangs (no response)
and the client stream goes idle until the client-side timeout. In one instance
the process also ignored SIGTERM and required kill -9.
Observed 3 times in 2 days across two builds and two different models, with
and without MTP, so it does not appear specific to a model, speculative
decoding, or a recent regression.
Environment
- llama.cpp CUDA backend; observed on build 452 (
9558fa4) and build 561 (ee4c505)
- 2× RTX 3090 (PCIe/PHB, no NVLink), driver 570.133.07, CUDA 12.8, Linux
- No
Xid errors in dmesg in any incident (not a GPU fault)
Incidents
A) Qwen3.6-35B-A3B Q8_0 (MoE, no MTP), single slot, 32K ctx, long-context
eval task: generation stopped after ~286 tokens (timing lines ceased), client
timed out after 20 min, server log showed cancel task then the process kept
spinning (R state), ignored SIGTERM, needed SIGKILL. Immediately before the
stall: slot get_availabl: … selected slot by LCP similarity, f_sim_best = 0.999.
B) Qwen3.8-27B Q6_K (embedded MTP, --spec-type draft-mtp --spec-draft-n-max 3),
--parallel 2, two concurrent agent workloads: slot 1 decoding normally
(~40 tok/s, n_decoded = 8337), then all timing output stops; /health OK,
/slots hangs, GPU 0%. Restart required. Full journal excerpt (926 lines around
the stall) available on request.
C) Same symptom pattern on build 561 during a client 300 s stream-idle
timeout; restart healed it.
Server invocation (incident B)
llama-server -m Qwen3.8-27B-Q6_K.gguf -mm mmproj-F16.gguf \
--spec-type draft-mtp --spec-draft-n-max 3 \
--jinja -ngl 999 --ctx-size 458752 --parallel 2 \
-ctk q8_0 -ctv q8_0 --cache-reuse 0 --no-context-shift \
--temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0
(--cache-reuse 0 --no-context-shift were added after incident A as a hunch;
incident B shows they do not prevent it.)
Notes
/health responding while /slots hangs suggests the slots endpoint blocks on
a mutex held by the stuck decode path — a liveness probe on /slots (or a
watchdog around the decode loop) would at least make the state detectable.
- Happy to reproduce with added instrumentation and to share full journals.
Server wedge: generation stalls mid-decode; /health OK but /slots hangs; process must be SIGKILLed
Summary
Under long-running load the server occasionally stops generating mid-decode:
print_timinglines cease, GPU utilization drops to 0%, the process stays alive,/healthstill returns{"status":"ok"}, but/slotshangs (no response)and the client stream goes idle until the client-side timeout. In one instance
the process also ignored SIGTERM and required
kill -9.Observed 3 times in 2 days across two builds and two different models, with
and without MTP, so it does not appear specific to a model, speculative
decoding, or a recent regression.
Environment
9558fa4) and build 561 (ee4c505)Xiderrors indmesgin any incident (not a GPU fault)Incidents
A) Qwen3.6-35B-A3B Q8_0 (MoE, no MTP), single slot, 32K ctx, long-context
eval task: generation stopped after ~286 tokens (timing lines ceased), client
timed out after 20 min, server log showed
cancel taskthen the process keptspinning (
Rstate), ignored SIGTERM, needed SIGKILL. Immediately before thestall:
slot get_availabl: … selected slot by LCP similarity, f_sim_best = 0.999.B) Qwen3.8-27B Q6_K (embedded MTP,
--spec-type draft-mtp --spec-draft-n-max 3),--parallel 2, two concurrent agent workloads: slot 1 decoding normally(~40 tok/s,
n_decoded = 8337), then all timing output stops;/healthOK,/slotshangs, GPU 0%. Restart required. Full journal excerpt (926 lines aroundthe stall) available on request.
C) Same symptom pattern on build 561 during a client 300 s stream-idle
timeout; restart healed it.
Server invocation (incident B)
(
--cache-reuse 0 --no-context-shiftwere added after incident A as a hunch;incident B shows they do not prevent it.)
Notes
/healthresponding while/slotshangs suggests the slots endpoint blocks ona mutex held by the stuck decode path — a liveness probe on
/slots(or awatchdog around the decode loop) would at least make the state detectable.