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_TEMPDIR auf NVMe und ohne noatime dominieren Metadaten-Roundtrips trotz niedriger CPU-Last.
  • Parallelität: zu hohes -j oder CMAKE_BUILD_PARALLEL_LEVEL auf 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) 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.

  1. Runbook listet kanonischen Redis-Host Port DB-Index und ACL-Rotation.
  2. SCCACHE_REDIS_KEY_PREFIX kodiert Produkt Xcode-Hauptstrom und Generationsmarke.
  3. SCCACHE_DIR und CCACHE_DIR kollidieren mandantenübergreifend nicht ohne Unterordner.
  4. CI schreibt sccache --show-stats oder ccache -s nach 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)

  1. Ein Cache je Pipeline-Klasse im ADR.
  2. Endpunkte Präfixe Pfade versionieren.
  3. Parallelität Timeouts am Referenz-Repo messen.
  4. Retry-Hülle plus sccache --show-stats.
  5. 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.