In einem Mehrregionen-Parallel-Cluster aus Mac mini M4 verschiebt sich der Engpass oft früher als die CPU: Liegt SQLite WAL auf einer gemeinsamen Netzwerk-Freigabe, treffen Checkpoints und gleichzeitige Builds auf dieselbe I/O-Schicht — mit messbarer Tail-Latenz. Darüber kommen Buildsperren, Retries und Artefakt-Syncs; der Disk-Wasserstand (1TB/2TB) kippt schneller als erwartet.

Warum WAL auf Freigaben I/O besonders „beißt“

Für Teams mit mehreren dedizierten Mac-CI- und Cache-Knoten über Regionen hinweg: klare Grenzen für Speicher-Topologie × SQLite, ausführbare PRAGMA-/journal_mode-Skripte, eine konservative Obergrenze für Warteschlangen-Parallelität sowie eine 1TB/2TB-Abnahme-Checkliste. Vertiefung und gleiche Runbook-Sprache finden Sie in Nomad-Affinität & Buildsperre, rsync-Artefakt-Matrix, Watchman, FSEvents & Disk-Schwellen und Mosh vs. SSH & flock.

Latenz zwischen AZs addiert sich zu jedem fsync-artigen Schritt: Was auf lokaler APFS noch im Mikrosekundenbereich liegt, wird auf SMB/NFS zum wiederkehrenden Jitter — gerade wenn große Link-Schritte oder Xcode-DerivedData parallel laufen. Daher zuerst Parallelität drosseln, bevor Sie synchronous lockern.

  • WAL-Schreibverstärkung: -wal- und -shm-Dateien liegen neben der Haupt-DB; jede Transaktion erzeugt mehr Netzwerk-Roundtrips als auf lokaler SSD.
  • Checkpoint-Resonanz: Beim Zurückschreiben von WAL-Seiten konkurrieren Checkpoints mit großen Build-Artefakten um Bandbreite und Metadaten-IOPS auf derselben Freigabe.
  • Sperren & Scheduler: Ohne abgestimmte busy_timeout-Werte und Backoff-Strategien stauen sich Jobs in der Queue — sichtbar als P99-Spikes, nicht als CPU-Last.

Entscheidungsmatrix: Topologie × SQLite-Nutzung

Topologie / Modus Beste Einsatzlage Abwägung & Risiko
Pro Knoten lokale APFS-SSD + WAL CI-Status-DBs, Metadaten für Bazel/Gradle-Remote-Cache, Toolchain-Indizes je Host. Stabilste Latenz; zentrale Reports brauchen Export oder Replikationspfad.
Ein Schreiber auf Freigabe + WAL Übergang: ein Dienst schreibt, übrige Knoten lesen oder ziehen Snapshots. Zwingend Buildsperre oder eindeutiger Schreib-PID; Checkpoints konkurrieren weiter mit großen I/O-Streams.
Mehrere Schreiber, eine .db auf Freigabe Nicht als Ziel-Architektur. Sperr-Rennen, Korruptionsrisiko und unvorhersagbare Tail-Latenz — Migration auf Ein-Schreiber oder Server-DB.
Lokales WAL + rsync / Artefaktbaum Parallel-Pool schreibt je lokaler DB; ein promote-Job verteilt Artefakte (passend zu bestehenden Runbooks). Passt zur Split-DNS- & Registry-Matrix.

Standardempfehlung: Datenbankdateien auf lokaler SSD halten. Nur wenn ein Freigabe-Pfad unvermeidbar ist: genau ein Schreiber und die folgenden Parallelitäts-Bandbreiten einhalten.

Ausführbare PRAGMA- und journal_mode-Empfehlungen

Auf lokaler SSD einmalig Journal-Modus und Synchronisationsstufe setzen; auf Netzwerk-Freigaben zuerst Sperr-Semantik und Risikoabnahme mit Stakeholdern klären.

Skript z. B. als init_ci_cache_db.sh, Pfad über CI_SQLITE_PATH:

#!/usr/bin/env bash
set -euo pipefail
DB="${CI_SQLITE_PATH:?}"
sqlite3 "$DB" <<'SQL'
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;     -- bei strengerer Durabilität: FULL
PRAGMA wal_autocheckpoint=1000;
PRAGMA busy_timeout=8000;
PRAGMA foreign_keys=ON;
PRAGMA cache_size=-64000;      -- ca. 64 MiB Page-Cache, an RAM anpassen
SELECT sqlite_compile_option_used('THREADSAFE');
PRAGMA journal_mode;           -- Erwartung: wal
PRAGMA user_version;
SQL

Fällt journal_mode=WAL auf delete zurück oder schlägt fehl, liegt meist ein Pfad- oder VFS-Problem vor — dann Datenbank migrieren oder Topologie ändern, nicht die Parallelität erhöhen. wal_checkpoint(TRUNCATE) nur im Wartungsfenster ohne andere Schreiber, damit die WAL-Datei nicht den Disk-Wasserstand unnötig anheizt.

Warteschlangen-Parallelität und I/O-Jitter

Kalibrieren Sie Startwerte mit iostat, Build-P99 und SQLite-busy-Zählern — nicht nur CPU:

  • Gleiche Freigabe, gleicher Schreibbaum: 1–2 gleichzeitige aktive Schreib-Builds (auf 1TB eher 1, auf 2TB vorsichtig 2 testen). Zuerst Queue-Parallelität senken, nicht synchronous lockern.
  • Promote / Golden-Image: Entweder max_parallel = 1 im Orchestrierer oder flock als autoritative Quelle — nicht beides widersprüchlich.
  • Lokal pro DB-Datei: Harte Obergrenze für „mehrere Writer auf dieselbe Datei“, um Hotspots zu vermeiden.

Steigen P99 und die WAL-Dateigröße: zuerst Parallelität und Schreibverstärkung adressieren, dann erst über größere SSDs oder getrennte Freigaben nachdenken.

Buildsperre und WAL-Lebenszyklus

Vor Migration, großem VACUUM oder manuellem Checkpoint: flock auf ein lokales Lockfile (nicht auf die Freigabe selbst legen). Ist der Scheduler ohnehin strikt serialisiert, kurze Lock-Timeouts und schnelles Fail statt endloser Retry-Schleifen.

LOCK_FILE="/var/tmp/ci-sqlite-maint.lock"
flock -w 30 "$LOCK_FILE" sqlite3 "/Volumes/shared/ci_meta.db" \
  "PRAGMA wal_checkpoint(PASSIVE);"

1TB/2TB-Disk-Abnahme (inkl. SQLite & Queues)

Belegung (genutzt) 1TB-Knoten (Parallel-Worker) 2TB-Knoten (Parallel-Worker) SQLite / Queue-Maßnahme
< 70% Standard-Parallelität; wöchentlich Stichprobe PRAGMA wal_checkpoint(PASSIVE) und WAL-Dateigröße trenden. Etwas längeres WAL-Fenster möglich; trotzdem -wal und APFS-Snapshots im Blick. Normales Dispatching; Baseline für busy und Tail-Latenz dokumentieren.
70%–80% Gelb: Schreib-Parallelität auf Freigabe auf 1; nicht kritische Jobs verschieben. Gelb: Cache-Rotation straffen; Wartungsfenster für TRUNCATE-Checkpoint planen. wal_autocheckpoint anpassen oder Checkpoints in Off-Peak manuell fahren.
> 90% Rot: neue Schreib-Builds und große Syncs stoppen; APFS-Snapshots, WAL-Reste und Artefakt-Temp leeren. Schreibzugriffe auf DB und promote hart stoppen, bis Belegung < 85% und Abnahme-Punkte erfüllt sind.
1–2
Empfohlene Obergrenze gleichzeitiger Schreib-Builds auf derselben Freigabe (Startwert)
80%
Gelb: Queue- und WAL-Trends ins On-Call-Dashboard
90%
Rot: harte Stop-Linie, Freigabe und DB-Zustand zuerst bereinigen

Artefakt-Bäume bleiben beim Muster „ein promote, ein rsync-Profil“; die Wasserstände aus diesem Artikel in dasselbe Runbook wie rsync-Matrix und Nomad-Buildsperre übernehmen.

FAQ

Viele CLIs schreiben gleichzeitig WAL über SMB? Nicht empfohlen — pro Maschine eigene DB oder ein dedizierter Schreibdienst.

PRAGMA synchronous=OFF? Senkt Latenz, vergrößert das Korruptionsfenster; nur für vollständig rekonstruierbare Cache-DBs und mit dokumentiertem Restrisiko.

Wie oft checkpointen? Abhängig von WAL-Wachstum; auf Freigaben selten TRUNCATE, in Ruhephasen PASSIVE plus weniger parallele Schreiber.

Wann wal_checkpoint(TRUNCATE)? Nur im genehmigten Fenster ohne andere Schreib-Verbindungen, wenn WAL und Speicherfüllung es erzwingen — siehe JSON-LD-FAQ.

Praxisorientierung. SQLite-Version, Build-Tooling und Compliance folgen Ihrer internen Policy; vor Löschoperationen oder checkpoint(TRUNCATE) auf Freigaben immer aktive Schreiber prüfen.
Ohne Login — Tarife & Bestellung

Speicher-Tier und Knotenzahl für Parallel-Cluster wählen

Pakete & Tarife, technische Kurzinfos im Hilfe-Center und den Überblick im Tech-Blog. Zusätzliche Mac mini M4-Instanzen mit 1TB oder 2TB SSD bestellen Sie über Kaufenohne vorherige Anmeldung, SSH-bereit für Ihren Remote-Mac-Cluster; unser Team hilft bei der Einordnung von WAL-Topologien und Queue-Limits.

Jetzt Knoten mieten Tarife & Speicher vergleichen