forgejo-runner-recycle restarts all 14 deploy runners simultaneously, producing a ~45 MB/s disk burst #840
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#840
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
The nightly
forgejo-runner-recycleCronJob restarts every scratch-recycled runner StatefulSet at once. Fourteen dind daemons then cold-start together and saturate the node's NVMe for several minutes. This is the direct cause of a user-visible slowdown reported on 2026-08-15.Timeline, 2026-08-15
forgejo-runner-recycle-29780175-wqqlmruns and succeedsforgejo-runner-deploy-*StatefulSets restart, within a 22 second windowDisk measurements
Block device counters on
nvme0n1p7across the burst window (about 270 seconds):IO pressure stall on the node,
fullline:Following window measured only 2.2 MB/s, confirming the burst was the runner restart and not steady state.
Why it hurts
Everything on kai-server shares this disk, including Forgejo's git repositories and its Postgres. During the burst, Forgejo's own request handling stayed under one second for all 17,430 requests it served that hour, but git operations and anything else touching disk pay the queueing cost.
Suggested direction
The recycle itself is correct and the 10Gi scratch cap that motivated it should stay. The problem is that it is simultaneous. Options:
Acceptance
A recycle run no longer drives sustained NVMe utilization above a chosen threshold, and IO pressure stall
fullavg60 stays in single digits through the window.Still live, and the blast radius doubled. Verified 2026-08-29 ~04:20Z.
The simultaneity this issue describes is unchanged on kai-server and now also exists on ser8, which did not run general pools when this was filed.
kai-server, after the 2026-08-28T16:15Z run
Twelve
forgejo-runner-deploy-*pods all report age12h2m, meaning they restarted inside the same window. Down from the fourteen in the original timeline, because the general pools left for ser8 under #693, not because anything staggered.ser8, after the 2026-08-28T09:15Z run
Eleven runner pods, created 09:15:49Z to 09:17:24Z, a 95 second spread:
forgejo-runner-ser8-flight-deck-0through-5forgejo-runner-ser8-gaming-0,-1,-2forgejo-runner-ser8-bridge-0forgejo-runner-build-ser8-flight-deck-0Every one carries a
dindsidecar, which is the cold start that produced the original 45 MB/s burst.So the fleet went from one 14-runner thundering herd to two herds of twelve and eleven, on two different disks, seven hours apart. The seven-hour offset is not a stagger. It is the timezone bug in #869, and it splits the herd by accident rather than by design.
What this changes about the fix
The body offers three directions: stagger the restarts, batch them, or spread pools across a wider window. The third one partly happened by accident and it is worth noticing that it helped. kai-server's herd is smaller now and its disk is the one under chronic pressure, per #870.
What has not happened is any deliberate control. A recycle still restarts every labelled StatefulSet in its cluster at once, and the ser8 herd is eleven dind cold starts against a disk that also carries the ClickHouse telemetry store.
Not re-measured
No block-device counters or IO pressure stalls were taken for either cluster today. The original 45 MB/s, 84% busy, and
full avg60 6.86figures are from 2026-08-15 on kai-server and should not be read as current. What is verified today is the restart topology, not its cost. The acceptance threshold in this issue still needs a fresh measurement on ser8 before anyone can say whether eleven concurrent dind starts hurt there the way fourteen hurt on kai-server.