Architektur 7. April 2026

2026 Entscheidungsmatrix: Runner-Parallelitätsslices und CI-/Agent-Pool-Fairness auf dediziertem Mac mini M4

NodeMac Team

Build-Infrastruktur

When you treat Mac mini M4 hosts as schedulable nodes, the most expensive mistake is cranking orchestrator concurrency and runner --max-jobs to the ceiling while ignoring unified memory bandwidth, simulator contention, and bursty agent toolchains. This 2026 playbook gives you two matrices—workload slices and fairness policies—plus six implementation steps, audit prompts, and explicit anti-patterns. Pair it with queue SLOs and capacity lending so “add another Mac” is a data-backed decision, not a reflex.

Background on wait times: queue depth and wait-time SLOs. Temporary automation borrowing: capacity lending. Sharded builds: parallel Mac build nodes. Disk pressure interacts with concurrency—see disk and artifact retention. Pricing: pricing; help: help.

Fairness is not socialism for CPUs; it is operational hygiene. When one product line can monopolize every heavy slot, other teams experience “random” slowdowns that look like flaky infrastructure. WIP limits and label separation convert tribal knowledge into enforceable policy. The matrices below are starting numbers—tune them with your own telemetry, but do not skip the habit of recording before/after wall-clock and memory histograms whenever you change slices.

Three reasons “more concurrent jobs” hurts before it helps

  • Unified memory pressure: Two heavy xcodebuild jobs routinely push resident set into the high 28–36 GB band; a third job often triggers OOM killers or pathological swap even when CPU meters look “fine.”
  • Simulator and metadata I/O: XCTest UI plus local embedding caches can starve APFS metadata; you will see low CPU with doubled wall-clock—misread as “need faster chips” instead of “too much parallel I/O.”
  • Agent bursts: OpenClaw-style gateways spawning helper processes share temp directories and file locks with CI, surfacing intermittent EBUSY errors that resist flaky-test quarantine because they are environmental.

Per-workload concurrency slice matrix (per M4 host)

Workload Suggested concurrency Co-located with agents
Heavy iOS compile + unit tests 2 Cap CI at 1 heavy job; reserve headroom for agents
Lint / static analysis only 3–4 May coexist with low-priority agents if CPU soft-cap ~70%
UI tests (multi-simulator) 1 Never share host with heavy compile; dedicate labels

Fairness policies: WIP, priority, and label prefixes

Policy Mechanism Best for
Team WIP cap Each org/repo may run at most N concurrent heavy jobs (example N=2) Shared pools with many product lines
Label isolation mac-ci-* never overlaps mac-agent-* Compliance separation between CI and automation
Time-boxed borrowing Relabel hosts for 2 h low-traffic windows with a ticket ID Short campaigns without permanent pool drift

Metrics: Track p95 queue wait and the distribution of simultaneous heavy jobs per host. If P90 > 2 while wall-clock regresses, reduce concurrency before buying hardware.

Orchestrator soft limits versus runner hard caps

Soft throttles live in the queue: for example, cap unfinished heavy jobs per repository on a shared pool. Hard caps live in the runner daemon: maximum simultaneously claimed jobs. They must move together—otherwise you either starve healthy machines or admit work the host cannot complete. Document both numbers in the same change ticket and replay YAML in staging before touching production.

Custom schedulers can gate dispatch on “host role + free memory”: when available RAM drops below 6 GB, refuse new heavy compiles but still allow lint-only tasks or read-only agent modes. That heuristic tracks Apple Silicon reality better than CPU-only dashboards.

With staging versus production pools, bake new slices in staging for 48 hours, capture comparative histograms, then promote. Avoid single change windows that simultaneously alter production queues and experimental branches.

During release weeks, lock UI hosts to a single concurrent suite and defer agent cron work to night windows. During steady state, if developers complain about tiny patches queueing behind unrelated teams, you may temporarily raise lint concurrency—but only through the same GitOps path and with a calendar reminder to revert. Ad-hoc SSH tweaks are how fleets silently diverge until the next all-hands postmortem.

Executive dashboards should show “saved dollars from avoided over-provisioning” alongside “developer-hours reclaimed from shorter waits.” If you only chart cost, teams will fight every throttle; if you only chart speed, finance will see runaway spend. Pairing the metrics keeps concurrency policy politically sustainable.

Six-step rollout checklist

  1. Baseline telemetry: Seven-day peak memory and storage queue depth per host.
  2. Classify heavy vs light jobs using pipeline metadata, not repository naming folklore.
  3. GitOps runner config: Concurrency and labels live in version control—no ad-hoc SSH edits.
  4. Orchestrator WIP rules: Per-org or per-repo ceilings on shared queues.
  5. Mixing drill: Run one heavy CI job plus an agent health probe for 15 minutes in pre-prod.
  6. Rollback switch: Keep a ticket template that flips labels back to “CI-only” in one merge.

Audit and on-call cues

Quarterly, sample whether anyone bypassed WIP by hard-coding runner hostnames in YAML archives. Correlate violations with incident MTTR. When p95 waits breach SLO but concurrency histograms look healthy, inspect label starvation and stacked drain windows before opening a capacity RFC.

Aligning with scalable node-pool thinking

As you evolve from “a few fixed Macs” to replaceable pools, keep concurrency slices synchronized with CMDB roles—compile, UI, agent-only. NodeMac rents dedicated Mac mini M4 with SSH/VNC across Hong Kong, Japan, Korea, Singapore, and the United States so you can validate a new slice on short-lived hosts before codifying it fleet-wide. Pay-as-you-go lowers the cost of experimentation compared with capital purchases.

If you already follow dispatchable Mac nodes for automation, mirror label prefixes and borrow windows into the same CMDB fields so documentation, scripts, and dashboards cannot drift silently.

Common anti-patterns

Fleet-wide “four concurrent jobs everywhere” ignores workload diversity; sharing a generic macos label between CI and agents invites security and performance surprises; watching average wait without concurrency histograms makes every problem look like “buy more Macs.” Print this matrix next to scalable Mac node pool workflows in your on-call primer.

When agents and CI share users or home directories, pair this guide with OpenClaw tool allowlists and filesystem sandboxes so automation cannot widen filesystem reach just because concurrency increased.

Pools nach Rolle skalieren?

M4 in HK·JP·KR·SG·US—Build und Agent trennen.

NM
NodeMac Cloud Mac
In ~5 Minuten

Dedizierte Apple-Silicon-Macs in der Cloud. SSH/VNC—HK·JP·KR·SG·US.

Loslegen