Zielgruppe: Plattform- und Build-Teams auf Remote-Mac-CI mit Apple Silicon, die zwischen sccache und ccache entscheiden und dabei Redis-Ziele, Schlüsselpräfixe, NFS-Mounts sowie Worker-Parallelität revisionssicher festhalten müssen.
Inhalt: zwei Tabellen Matrix plus Worker-Schwellen, nummerierte Checkliste, kopierbare Exporte für Verzeichnisse und Idle-Timeouts, exponentielle Retry-Stufen 2/4/8 s sowie kompakte FAQ zu grenzüberschreitenden Treffern.
Vertiefung ohne Login: Technik-Blog, Nix-Substituter-Matrix für Binary-Caches parallel zu Compiler-Artefakten, MacPull-Startseite für Kapazität neben dem Cache-Tier.
- Präfix-Chaos: wechselnde
SCCACHE_REDIS_KEY_PREFIX-Regeln isolieren logische Schlüsselräume — Teams interpretieren echte Misses fälschlich als Compiler-Defekte. - NFS: ohne lokales
CCACHE_TEMPDIRauf NVMe und ohnenoatimedominieren Metadaten-Roundtrips trotz niedriger CPU-Last. - Parallelität: zu hohes
-joderCMAKE_BUILD_PARALLEL_LEVELauf geteilten Remote-Macs verhungert Link-Schritte und Redis-Wrapper gleichzeitig.
Entscheidungsmatrix: sccache vs. ccache auf gemeinsamen Mac-Pools
Pro Pipeline-Klasse genau einen primären Compiler-Cache wählen. Gemischte Wrapper ohne klar getrennte Variablen für CC und CMake-Launcher erzeugen leise verfälschte Statistiken und erschweren Audits gegenüber Sicherheits- und Release-Teams.
| Ansatz | Ideal wenn | Grenzüberschreitend | Risiko / Hinweis |
|---|---|---|---|
| sccache + Redis | Regionaler TLS-Redis; Clang/Rust | Schlüsselraum pro Produkt entkoppelt Objektfile-WAN | maxmemory, Hot-Keys bei Merges |
| sccache + Objektspeicher | S3-Retention statt RAM-only | Shards + Multipart-Limits dokumentieren | PUT-Stürme; lokales SCCACHE_DIR |
| ccache + APFS | Dedizierter Host, großes CCACHE_DIR |
Wenig WAN wenn Runner nah | Ephemer: Wärme-Plan nötig |
| ccache + NFS / HTTP-Sekundär | Clang + POSIX/HTTP im Metro | Internationale Hits nur bei niedriger RTT | Mounts, Quotas, CCACHE_MAXSIZE |
Kein Werkzeug ersetzt eine gepflegte Toolchain-Matrix: jeder Wechsel an Xcode- oder Clang-Minor-Versionen ändert Präprozessor-Fingerabdrücke. Trefferquoten-Dashboards daher immer mit Compiler-Stream und Image-Revision labeln, sonst wirken Regressionen wie Netzwerk-Flakes.
Zweite Vergleichstabelle: Worker- und Timeout-Parameter (Richtwerte)
Richtwerte für geteilte Apple-Silicon-Remote-Macs — nach RSS Link-Zeit Redis-p95 kalibrieren.
| Parameter | Startwert geteilter Pool | Begründung |
|---|---|---|
CMAKE_BUILD_PARALLEL_LEVEL / Ninja -j |
Halbe Kerne bis 8 | Linker und I/O teilen RAM mit Nachbarn |
SCCACHE_IDLE_TIMEOUT (Sekunden) |
1800s, LTO lang: 3600 | Disconnects in Links vermeiden |
| Redis-Client-Connect-/Read-Timeout (ms) | 3000 / 120000 ms | Connect kurz Reads großzügig |
CCACHE_MAXSIZE / CCACHE_LIMIT_MULTIPLE |
32G / 0,85 | Trimmen gegen Brownouts |
| Transport-Retry-Leiter (Versuche × Pause s) | 4× Pause 2/4/8s | Danach Stats und Abbruch |
Checkliste: Redis, Präfixe, NFS, Mandantentrennung
Redis: SCCACHE_REDIS_ENDPOINT mit rediss:// sobald TLS auf dem Broker endet; Zugangsdaten ausschließlich über SCCACHE_REDIS_USERNAME und SCCACHE_REDIS_PASSWORD aus dem Vault; SCCACHE_REDIS_DB und ACL-Namen im Runbook versionieren.
NFS: Mounts mit noatime, herstellerkonforme rsize/wsize, konservatives actimeo; CCACHE_TEMPDIR strikt auf lokaler SSD. Ozean-übergreifende Freigaben nur nach Lastnachweis freischalten.
Platten-Gates: für Staging und ggf. Filer Warnung bei etwa 82 % Belegung, Drossel ab 87 %, harter Stopp ab 92 % — konsistent mit anderen MacPull-Matrizen halten.
- Runbook listet kanonischen Redis-Host Port DB-Index und ACL-Rotation.
SCCACHE_REDIS_KEY_PREFIXkodiert Produkt Xcode-Hauptstrom und Generationsmarke.SCCACHE_DIRundCCACHE_DIRkollidieren mandantenübergreifend nicht ohne Unterordner.- CI schreibt
sccache --show-statsoderccache -snach Compile in die Logs.
Ausführbare Umgebungsvariablen, Pfade, Retry-Hülle
Hostnamen anpassen; keine Secrets in Logs.
# sccache Redis TLS
export SCCACHE_REDIS_ENDPOINT="rediss://sccache-redis.internal:6379"
export SCCACHE_REDIS_USERNAME="ci-sccache"
export SCCACHE_REDIS_PASSWORD="${SCCACHE_REDIS_PASSWORD_SECRET}"
export SCCACHE_REDIS_DB="0"
export SCCACHE_REDIS_KEY_PREFIX="firma/ios/xcode-16-3/"
export SCCACHE_REDIS_EXPIRATION="2592000"
export SCCACHE_NAMESPACE="firma-ci"
export SCCACHE_DIR="${CI_PROJECT_DIR:-$PWD}/.sccache-staging"
export SCCACHE_IDLE_TIMEOUT="1800"
export SCCACHE_CACHE_SIZE="64G"
export RUSTC_WRAPPER="$(command -v sccache)"
export CARGO_BUILD_RUSTC_WRAPPER="${RUSTC_WRAPPER}"
export CMAKE_C_COMPILER_LAUNCHER="$(command -v sccache)"
export CMAKE_CXX_COMPILER_LAUNCHER="$(command -v sccache)"
mkdir -p "${SCCACHE_DIR}"
# ccache APFS
export CCACHE_DIR="${CI_PROJECT_DIR:-$PWD}/.ccache"
export CCACHE_TEMPDIR="${TMPDIR:-/tmp}/ccache-${CI_JOB_ID:-lokal}"
export CCACHE_MAXSIZE="32G"
export CCACHE_LIMIT_MULTIPLE="0.85"
export CCACHE_COMPRESS="1"
export CCACHE_COMPRESSLEVEL="6"
export CCACHE_SLOPPINESS="pch_defines,time_macros"
export CMAKE_C_COMPILER_LAUNCHER="$(command -v ccache)"
export CMAKE_CXX_COMPILER_LAUNCHER="$(command -v ccache)"
mkdir -p "${CCACHE_DIR}" "${CCACHE_TEMPDIR}"
# Retry 4x 2/4/8s
run_mit_cache_retries() {
local versuch=1 max=4 pause=2
while [ "${versuch}" -le "${max}" ]; do
echo "Compile-Versuch ${versuch}/${max}"
if "$@"; then return 0; fi
sleep "${pause}"
pause=$((pause * 2))
versuch=$((versuch + 1))
done
return 1
}
Timeouts: bei langen Links zuerst SCCACHE_IDLE_TIMEOUT anheben statt -j. ccache 4.x HTTP: Vendor-Defaults pro Region kalt messen.
Fünf Rollout-Schritte (kurz, auditierbar)
- Ein Cache je Pipeline-Klasse im ADR.
- Endpunkte Präfixe Pfade versionieren.
- Parallelität Timeouts am Referenz-Repo messen.
- Retry-Hülle plus
sccache --show-stats. - Dashboards an Compiler-Stream und Revision.
FAQ
Ersetzt sccache distcc? Nein — sccache speichert Compiler-Ergebnisse; verteilte Compile-Farmen bleiben ein separates Architekturthema.
Soll jede ccache-Sloppiness-Option aktiv sein? Nur nach explizitem Security-Review; jede Flagge dokumentieren, weil Sloppiness Reproduzierbarkeit gegen Treffer tauscht.
Artefakt-Schicht: Container- und Chart-Pulls teilen oft dieselbe SSD — siehe GHCR-/Registry-Pull-Matrix.
Fazit
sccache+Redis gewinnt bei gemeinsamem Objektraum über Regionen; ccache+APFS optional NFS bei POSIX-Policy und niedriger RTT. Präfixe Timeouts Retry 2/4/8 ins Runbook zur Compiler-Matrix.
Ohne Login: Preise, Kaufen, Hilfe auf macpull.com; danach Technik-Blog.
Remote-Mac neben Cache-Endpunkt
Gleiche Region wie Redis/NFS — RTT und Treffer real messen. Kein Login nötig.