CI perf (settings): merge queue builds 5 entries at a time — a 13-PR burst took 100 min to drain on a 21-min CI run (~21 min per PR past the 5th)
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- Unter einer Stunde
- Anfängerfreundlichkeit
- 12/100
- Issue-Typ
- Refactoring
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- github-actions
- Bereich
- ci-cd
Rechercherichtung
The change is a GitHub merge-queue ruleset setting (ruleset 24668460, merge_queue rule, max_entries_to_build), not a file in the repository, so there is no code to open. Only a maintainer with admin access can decide and apply it, and the issue itself says the implementer routine cannot. Done means a human has made the decision and either applied the new value or closed the issue with a reason.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Filed by the CI profiler routine (observer only). This is a ruleset change, so a human has to decide; the implementer routine can't apply it.
Measurement
Window: 2026-10-08 08:17 → 2026-10-09 08:17 UTC. Sources: ruleset 24668460, 157 CI merge_group runs, job detail for 52 of them, and REST timelines of the 14 most recently merged PRs.
Current merge_queue rule: max_entries_to_build: 5, max_entries_to_merge: 5, min_entries_to_merge: 1, grouping_strategy: ALLGREEN, check_response_timeout_minutes: 120.
| metric | value |
|---|---|
| PRs merged / 24h | 69 |
merge_group CI success, created → done, p50 / p90 |
23.4 / 46.1 min (n=80); 21.5 / 23.0 min since 04:17 (n=16) |
| Last enqueue → merge, p50 / p90 (14 PRs merged 03:14–08:01) | 64 / 69 min |
| First enqueue → merge, p50 / p90 | 65 / 82 min |
What happened in the 06:19–08:01 burst. 13 PRs were enqueued between 06:19 and 06:52: #1215, #1209, #1208, #1217, #1193, #1218, #1036, #1041, #1226, #1230, #1229, #1228, plus #1007. They were tested in waves of at most 5 CI runs, and each wave started only after the previous one finished:
| wave created | runs | outcome |
|---|---|---|
| 06:19–06:20 | 5 | all cancelled. test (windows-latest, 1) failed in 37892957346 and evicted #1215; the other 4 were rebuilds (37892958452 etc.) |
| 06:34–06:35 | 5 | 2 ok, 3 cancelled (coverage-docker (sbt) failure in 37894279963) |
| 06:56 | 5 | all ok → merged 06:56 / 07:19 |
| 07:17–07:19 | 5 | all ok → merged 07:38–07:41 |
| 07:38–07:41 | 4 (+1 cancelled) | merged 08:01 |
So the queue's throughput is 5 PRs per ~21 min (≈14/h). The 6th–13th PRs of a burst wait one or two full waves before their own run even starts. Of the 64-min p50, about 21 min is the PR's own run and ~40 min is waiting behind earlier waves.
Where the time goes
- Per wave:
test (windows-latest, 2)(Run tests 15.0 min p50 + Build 2.2),coverage-docker (sbt)→coverage-merge(#1225), and the Gradlee2e_redirect_gradle_build … gradle_hosted_blegs (13.4 min p50, #1171) all finish at 20–22 min. Queue wait for those jobs is ≤0.1 min (Linux/Windows) and 0.2 min p50 (macOS), so the waves are not runner-starved. The limit is the build depth. - Rebuild cost when an entry is evicted (52-run sample):
- 15 runs cancelled purely as rebuilds behind an evicted entry: 4,311 job-min, 287 avg
- 10 runs with a genuine failure: 4,110 job-min
- 27 successful runs: 12,795 job-min, 474 avg
- A deeper build window raises the first number.
Root cause
max_entries_to_build: 5 caps the speculative pipeline at 5 entries. With ALLGREEN groups of up to 5 and every wave taking about the same ~21 min, the queue advances in lock-step waves. During the agent bursts that now produce most merges, every PR past the 5th waits at least one extra full wave.
Proposed fix (ruleset 24668460, merge_queue rule)
- Raise
max_entries_to_build5 → 8, and keepmax_entries_to_mergeat 5 (or raise it to 8 too, so a fully green window lands in one merge). - Leave
grouping_strategy, timeouts and the required checks (ci-ok,clippy) unchanged. - Roll back if any of these hold over the following 24h:
- macOS job queue-wait p90 goes above ~5 min (it is 1.8 min now)
- the merge_group eviction rate stays above ~20%. Then the extra rebuilds cost more than the latency buys; prefer landing the ci-janitor flake fixes (#1237, #1238, #1222, #1244) first.
Expected saving
- Latency: ~21 min off enqueue → merge for every PR that is 6th–8th in line. In the window above that was 8 of 13 PRs. Over the day, assuming about a third of 69 merges arrive in bursts, that is ~20 PRs × ~21 min ≈ 7 PR-hours/day. Merge-queue p50 should fall from ~64 toward ~45 min during bursts.
- Critical path per affected PR: −21 min (one wave).
- Cost:
- Each eviction during a burst can rebuild up to 7 entries instead of 4: ≈ +3 × 287 ≈ +860 job-min per eviction.
- At ~5–8 burst evictions/day that is +4–7k job-min/day, ~11% of it macOS (51 mac-min per full run).
- Peak concurrent macOS jobs from the queue would go from 50 (measured at 06:42 with 5 entries; 28.9 mac jobs per run) to roughly 80.
- #1176 / #1234 (fewer e2e-macos legs) would offset most of that.
Coverage and risk
- No test moves; every job still runs on every merge_group run.
- Required check names are unchanged.
- Main risk: macOS pool pressure. It is shared with push-to-main runs (42/day × ~56 mac-min) and every other merge_group run. Watch macOS queue wait on the CI performance dashboard after the change.
- Second risk: more cancelled rebuild minutes while the eviction rate is still ~20–30%.
Effort
S (one ruleset field, reversible in seconds).
ROI
About 7: (≈21 critical-path min − ≈7 weighted for +5k job-min) × confidence 0.5 ÷ effort 1. Same scale as the dashboard.
- Vorherrschende Sprache
- Rust
- Sterne
- 9
- Forks
- 2
- Ø Merge
- 18 Std. 47 Min.
- Gemergte PRs (30 T.)
- 637
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus SocketDev/socket-patch
-
agent:triaged arch-audit priority:p3 refactor
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
SocketDev/socket-patch#1860 ·
Maintainer antworten meist innerhalb von 1 Tag
-
agent:triaged arch-audit priority:p3 refactor
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
SocketDev/socket-patch#1838 ·
Maintainer antworten meist innerhalb von 1 Tag
-
arch-audit refactor
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
SocketDev/socket-patch#1987 ·
Maintainer antworten meist innerhalb von 1 Tag
-
agent:triaged arch-audit priority:p3 refactor
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
SocketDev/socket-patch#1983 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
agent:triaged arch-audit bug priority:p3
Schwierigkeit 3/5 Ein halber Tag Anfängerfreundlichkeit 55/100
SocketDev/socket-patch#1982 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in SocketDev/socket-patch
Ähnliche Issues
-
area:docs documentation good first issue priority:medium
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 78/100
rtk-ai/rtk#4958 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
feature
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
calagopus/panel#285 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug]: streamed Responses API flex_unavailable error maps to 500 InternalServerError instead of 429Offenllm translation
Schwierigkeit 2/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
BerriAI/litellm#49736 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
question
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag
-
autoindex tests: denied loopback bind shows only PermissionDenied (255 failures), not the causeOffenfield-report
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Maintainer antworten meist innerhalb von 1 Tag