Festplatten-Wasserstand · DerivedData / CocoaPods / Gradle · 3 Artefakt-Schichten · 6-Schritt-Runbook · Hard-Thresholds
Betrieb, Mobile-Plattform und Tech Leads mit vertraglichen Disk-SLOs für gemeinsame Mac-Build-Pools sehen freitags oft dieselben Alarme: Runner online, Jobs mit „No space left“; DerivedData füllt das System-Volume; CocoaPods- und Gradle-Global-Caches ohne Owner; Artefakte bleiben nach rsync lokal. Zuerst wer welches Problem hat bei Mac-Mesh-Multi-Tenant-Rotation ohne messbare Wasserstände und schichtweise Rücknahme. Dann Fazit: L1 DerivedData / L2 Abhängigkeits-Caches / L3 CI-Artefakte plus 6-Schritt-Runbook — auditierbare Routine statt Feuerwehr. Enthalten: 5 versteckte Kosten, Strategietabelle, Skriptfelder, 6 Schritte, 3 Hard-Thresholds, FAQ. Querverweise: Seat-Locks, Golden-Image-Checkliste, rsync und Objektspeicher, 3-Pool-SLO-Matrix, and Git-Worktree-Isolation.
In Mac-Mesh-Tickets 2026 ist Disk selten nur „100 GB fehlen“. Ohne Vertrag zwischen Tenant-Rotation, Cache-Lokalität und Artefakt-Lebenszyklen zeigt APFS freien Platz — Xcode scheitert beim Schreiben temporärer Dateien.
DerivedData ohne Grenze: Mehrere Repos teilen ~/Library/Developer/Xcode/DerivedData; Index und ModuleCache vermischen sich über Branches; ein clean löscht den ModuleCache des Nachbarn — zufällige Link-Fehler statt „Disk voll“.
CocoaPods/Gradle-Global-Cache ohne TTL: ~/Library/Caches/CocoaPods and ~/.gradle/caches wachsen stetig; alte Tarballs nach Pod-Upgrade bleiben; Worktree-Mehrbranch Parallelität verstärkt Contention.
Artefakte „hochgeladen, lokal geblieben“: Objektspeicher OK, aber $CI_ARTIFACTS_DIR ohne Retention; rsync-Abschluss-Hook fehlt — IPA/dSYM fressen die Platte.
APFS-Snapshots vs. „verfügbar“: Lokale Snapshots täuschen df; echte Schreibkapazität bricht bei Compile-Peaks. waterline_used_pct pro Volume/Schicht fehlt.
Cleanup vs. Seat-Lock: Verzeichnis-Sweep vor Lease-Ende oder Konflikt mit Seat-Lock-TTL, — „Platte leer, Build rot“.
Lieferumfang: 3-Schicht-Verzeichnisdict, warn/hard-Doppelwasserstand, LRU bei Lease-Ende, wöchentliche Golden-Image-Drift-Prüfung getrennt. Ohne das kein „beliebiges monorepo parallel“ auf Shared Pools. Nächster Abschnitt: drei Cleanup-Philosophien — kein „Freitag ssh rm -rf für alle“.
Disk-Governance ist nicht „härter putzen“. Balance Build-Hit-Rate, auditierbare Bereinigung, Tenant-Isolation. Tabelle im Change-Review: pro Schicht (L1/L2/L3) nur eine Default-Strategie.
| Strategie | L1 DerivedData | L2 Pods/Gradle | L3 Artifacts | Geeignet für | Hauptrisiko |
|---|---|---|---|---|---|
| Manuelles Cron | Wochenend-rm global | Gelegentliches pod-cache-prune | find nach Alter | Kleine Teams, wenig Parallelität | Nachbar-Löschungen, kein Audit |
| Wasserstand-Daemon | LRU pro Workspace-Hash | Evict bei Kapazität | 48h nach rsync-Erfolg | Shared-Pool-Default | Metriken und Lock-Vertrag nötig |
| Image-Reset | Snapshot-Rollback leert | Mit Image erneuert | Volume-Ersatz | Drift außer Kontrolle, Compliance-Snapshots | Cold-Start-Compile-Verlangsamung |
Grundregel: Shared Pools default „Wasserstand-Daemon“; Image-Reset nur quartalsweise mit der Golden-Image-Drift-Checkliste, nicht tägliches LRU.
Wenn Dedicated-Pools und Shared-Rotation koexistieren, brauchen L1-Cache-Keys einen Pool-Typ-Tag, sonst evictiert Shared-Sweep die Dedicated-Lokalität.
L1: /var/mesh/cache/deriveddata/{workspace_hash}, gebunden via Xcode DERIVED_DATA_DIR. L2: /var/mesh/cache/cocoapods, /var/mesh/cache/gradle—kein Zurückschreiben in User-Home-Global-Caches. L3: /var/mesh/artifacts/{job_id}—nach Upload nur Checksum-Sidecar. Monitoring meldet layer_*_bytes pro Schicht statt vages „/ partition 85%“.
Diese 6 Schritte setzen Mac-Mesh-Labels und Seat acquire/release voraus. Reihenfolge nicht überspringen: Wasserstände ohne Metriken sind blinde Löschungen.
Drei-Schicht-Dictionary und Pfade einfrieren: L1/L2/L3-Wurzeln und warn (82%)/hard (92%) in Repo mesh-disk-policy.yaml, Standard-Mounts registrieren in der Image-Checkliste.
disk-waterline-Probe deployen: alle 60s Volume-Nutzung und Schicht-Bytes; Export Prometheus/OpenTelemetry; bei hard drain und fail-fast neue Jobs.
DerivedData isolieren: CI setzt DERIVED_DATA_DIR auf Workspace-Hash-Bucket; Lease-Ende LRU — nie globales DerivedData sweepen.
L2-Abhängigkeits-Cache evict: pod cache clean kapazitätsgetrieben; GRADLE_USER_HOME unter mesh; max-cache-size begrenzen.
Artefakte und rsync-Hooks: Objektspeicher-Multipart-Complete-Callback löscht lokales L3; Fehl-Retries 7 Tage — Felder wie im Artefakt-Runbook.
Wöchentlicher Check und Drill: Golden-Image-Checksums, Job-Reject bei 90% simulieren, Cleanup-Audit loggen; bei Burst-Overflow zuerst L3 leeren, dann interruptible Jobs.
hostname pool_type volume_mount waterline_used_pct waterline_warn_threshold waterline_hard_threshold layer_l1_deriveddata_bytes layer_l2_cocoapods_bytes layer_l2_gradle_bytes layer_l3_artifacts_bytes seat_lease_id last_cleanup_ts_unix cleanup_evicted_bytes_1h disk_waterline_hard_stop
Hinweis: Probe-Output erste Grafana-Zeile, nicht nur OS-Alerts. cleanup_evicted_bytes_1h mit erfolgreichen Builds — echte Bereinigung vs. „weniger Builds, Disk sieht besser aus“.
Disk-Alerts überlappen oft Queue-SLO -Symptome. Tabelle: Kapazität, Cache-Keys oder Artefakt-Stau vor Sweep-Umfang.
| Symptom | layer_* dominant | Wahrscheinliche Ursache | Erste Maßnahme |
|---|---|---|---|
| Nur Xcode-Schritt scheitert | L1 high | DerivedData-Cross-Talk oder Index-Korruption | Bucket per Workspace-Hash leeren |
| Gemischter Android/iOS-Pool langsam | L2 high | Pods/Gradle nie evicted | L2-Kapazitätsobergrenze straffen |
| Upload OK, Disk voll | L3 high | rsync-Hook nicht gebunden | Objektspeicher-Callback ergänzen |
| df OK, Schreiben scheitert | Snapshots | APFS local Snapshots | Snapshot-Retention reduzieren + Probe |
Warnung: Kein volume-level rm -rf bei Seat-Lock. Cleanup-Skripte: seat_lease_id leer oder Lease abgelaufen, sonst ModuleCache im Compile löschen.
Füllt L1 innerhalb 24h nach Bucket-Clear wieder, prüfen: Worktree-Isolation — mehrere volle DerivedData-Bäume auf einem Knoten, bevor mehr Disk gekauft wird.
Feldkompromisse aus 16GB/24GB-Shared-Pools. An Change-Tickets als externe SLO-Anhänge; Dedicated kann warn um 5 Punkte senken für stabileren Index-Hot-Cache.
waterline_warn_threshold=82 löst L3→L2→L1-Evict-Reihenfolge; waterline_hard_threshold=92 lehnt neue Jobs ab, disk_waterline_hard_stop=1.Bei 512GB-System-Volumes mit ~60% für mesh: L2 gesamt 80GB (je 40GB Soft-Cap CocoaPods/Gradle), L3 pro Job 12GB (inkl. dSYM). „Nur Wochenend-Cron“ oder „alle SSH-löschen Cache“ ohne Audit-Felder und Seat-Verträge — Nachbar-Löschungen, Cold-Starts, halbgeschriebene Artefakte in Release-Woche. Für iOS/Android-CI und Disk-SLOs auf vertragsfähiger Cloud-Mac-Mini-Kapazität ist VpsMesh Mac Mini Cloud-Miete meist die bessere Wahl (DSGVO-taugliche Audit-Pfade). Siehe Preisseite, Hilfezentrum und Bestellseite.
Standard: Workspace-Hash-Buckets mit Seat-Lease; Lease-Ende LRU. Mehrbranch: Worktree-Isolation article; kein unbegrenztes globales ~/Library/Developer/Xcode/DerivedData.
Runner fail-fast, disk_waterline_hard_stop melden; Scheduler routet oder Burst. Seat-Semantik in der Seat-Lock-Artikel.
Ja. Disk-Cleanup nur Runtime-Müll; ersetzt nicht die Snapshot-Drift-Checkliste. Onboarding im Hilfezentrum; Pläne auf der Preisseite.