fix(kiosk): restore in-process-gpu + CPUQuota=200% to stop choppy HDMI audio

Both had regressed back to the pre-2026-06-28-incident state: GPU_FLAGS used
--enable-gpu-rasterization on any node with a GPU, and CPUQuota was 75%.
On archy-x250-exp (Intel HD 5500 under X11) this spins a dedicated GPU
process at 55-92% CPU (falls back to software compositing anyway), and the
75% cgroup quota throttled the kiosk unit ~81% of the time (nr_throttled
4856/6005) — the exact CPU-starvation signature documented as the choppy-
audio root cause. Restores the validated fix: --in-process-gpu,
--num-raster-threads=1, GpuRasterization disabled via --disable-features,
CPUQuota=200%. Verified on archy-x250-exp: no separate gpu-process, throttling
dropped to ~3% (nr_throttled 14/503).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
ssmithx 2026-07-01 17:02:43 +00:00
parent fca34270be
commit e559ccb767
2 changed files with 12 additions and 7 deletions

View File

@ -79,12 +79,14 @@ xset s noblank 2>/dev/null || true
pkill -u archipelago -f 'chromium.*localhost' 2>/dev/null || true pkill -u archipelago -f 'chromium.*localhost' 2>/dev/null || true
sleep 1 sleep 1
# GPU vs headless (#36). On a real kiosk display with a GPU, GPU rasterization is # GPU vs headless (#36, choppy-audio incident 2026-06-28). --enable-gpu-rasterization
# fast. On a GPU-less / headless server (no /dev/dri), --enable-gpu-rasterization # spins a dedicated GPU process at 55-92% CPU even on real GPU hardware (Intel HD 5500)
# forces GPU paths that fall back to software compositing and SPIN a full core at # because under X11 it falls back to software compositing anyway — that CPU
# ~92% CPU, saturating the node. Detect the GPU and pick safe flags accordingly. # starvation is what caused choppy HDMI audio. --in-process-gpu avoids the
# separate process; GpuRasterization is also disabled via --disable-features below.
# On a GPU-less / headless server (no /dev/dri), disable GPU entirely instead.
if [ -e /dev/dri/card0 ] || [ -e /dev/dri/renderD128 ]; then if [ -e /dev/dri/card0 ] || [ -e /dev/dri/renderD128 ]; then
GPU_FLAGS="--enable-gpu-rasterization --num-raster-threads=2" GPU_FLAGS="--in-process-gpu --num-raster-threads=1"
else else
GPU_FLAGS="--disable-gpu --num-raster-threads=1" GPU_FLAGS="--disable-gpu --num-raster-threads=1"
fi fi
@ -103,7 +105,7 @@ while true; do
--disable-translate \ --disable-translate \
--no-first-run \ --no-first-run \
--check-for-update-interval=31536000 \ --check-for-update-interval=31536000 \
--disable-features=TranslateUI,MetricsReporting,AutofillServerCommunication,PasswordManagerEnabled \ --disable-features=TranslateUI,MetricsReporting,AutofillServerCommunication,PasswordManagerEnabled,GpuRasterization \
--disable-session-crashed-bubble \ --disable-session-crashed-bubble \
--disable-save-password-bubble \ --disable-save-password-bubble \
--disable-suggestions-service \ --disable-suggestions-service \

View File

@ -25,8 +25,11 @@ RestartSec=5
# backend (it caused the .198 receive timeout + deploy storms). Cap CPU + memory # backend (it caused the .198 receive timeout + deploy storms). Cap CPU + memory
# so a runaway kiosk can never take the whole machine down; Delegate so the cap # so a runaway kiosk can never take the whole machine down; Delegate so the cap
# also binds the chromium/Xorg children in this unit's cgroup. # also binds the chromium/Xorg children in this unit's cgroup.
# CPUQuota=75% (0.75 cores) was too tight even for normal playback — the kiosk
# was throttled ~40% of the time, which is what caused choppy HDMI audio on
# archy-x250-exp (2026-06-28 incident). 200% (2 cores) gives enough headroom.
Delegate=yes Delegate=yes
CPUQuota=75% CPUQuota=200%
MemoryMax=1500M MemoryMax=1500M
MemoryHigh=1200M MemoryHigh=1200M