Pourquoi une grappe Mac distante amplifie la charge des watchers et du disque
Une grappe Mac distante multiplie les cycles de checkout, les réinstallations de dépendances et les recompilations concurrentes. Plusieurs jobs observent le même gabarit d’arbre : le trafic des vnodes et des flux FSEvents explose — c’est une tempête d’événements — avant même l’étape de link. Sans plafonds explicites, le CPU M4 sert surtout à invalider des graphes incrémentaux plutôt qu’à produire des binaires.
- Fan-out des watchers : des racines par défaut qui incluent sorties de build, caches ou magasins de paquets multiplient les notifications entre agents parallèles.
- Parallélisme non borné : sans quota par pool, les volumes APFS partagés subissent du jitter I/O et plusieurs jobs invalident leurs caches au même instant.
- Dérive du niveau disque : simulateurs, couches conteneur et arbres « golden » absorbent la marge jusqu’à une panne de linkage en milieu de pipeline.
Pour le mouvement d’artefacts après build, alignez la politique rsync sur la matrice artefacts Mac mini M4 inter-régions. Pour les sessions shell longues sur liaisons instables, croisez avec le guide Mosh vs SSH, jitter et flock. Questions d’accès ou de facturation : Centre d’aide.
Watchman vs sondage Git : tableau comparatif pour la CI monorepo
Watchman convient aux graphes incrémentaux rapides sur Apple Silicon ; le sondage Git échange de la latence contre une courbe CPU plus prévisible lorsque la pression des watchers dépasse le budget. Standardisez le choix par pool d’agents à partir du tableau ci-dessous, puis figez-le dans l’image dorée pour éviter les dérives entre régions.
| Signal | Priorité Watchman | Priorité sondage Git |
|---|---|---|
| Objectif de latence | Invalidation sub-seconde une fois les ignores stricts. | Secondes à dizaines de secondes ; stable sous churn intense. |
| CPU sur M4 en pic | Faible si racines étroites ; pics si des dossiers « oubliés » fuient des ignores. | Paquets prévisibles liés uniquement à l’intervalle de poll. |
| Risque opérationnel | Exige une hygiène watchman watch-del-all entre jobs sur pools partagés. |
Peut rater des edits ultra-rapides si l’intervalle reste conservateur. |
| Défaut grappe | Metro, React Native, très grands graphes JS/TS. | Repli si pression sysctl / vnode ou échec SLO « tempête ». |
Diffusez un .watchmanconfig partagé excluant node_modules, Pods, sorties build et objets SCM — des ignores manquants bloquent la mise en prod sur les pools mutualisés.
{
"ignore_dirs": [
"**/node_modules",
"**/.git/objects",
"**/Pods",
"**/DerivedData"
],
"settle": 20
}
Seuil : montez settle vers 40–80 ms lorsque les compteurs de tempête remontent ; au-delà, évaluez un repli partiel vers Git ou une réduction du nombre de racines surveillées.
Limites sysctl / fs et paramètres de throttling
Couplez le réglage des watchers aux plafonds hôte : un seul job ne doit pas épuiser les descripteurs pendant une tempête d’événements. Mesurez ulimit -n avant d’élargir le fan-out parallèle sur des nœuds M4. Sur monorepos géants, tracez en parallèle la latence des appels stat et le taux de notifications Watchman pour corréler avec la charge noyau.
- Descripteurs : visez au moins 2× le pic de descripteurs ouverts mesuré ; sinon basculez les jobs lourds vers sondage Git ou réduisez la profondeur d’arbre exposée.
- Throttling compilation : plafonnez les voies Swift lourdes ou LTO à deux à quatre instances concurrentes par tranche 16–24 Go jusqu’à ce que les attentes sur verrou se contractent.
- Préparation par lots : regroupez les étapes très « filesystem » pour que Watchman voie une salve contrôlée plutôt que des micro-écritures continues.
Exemple d’amorçage (session) — validez la persistance via sysctl.conf avec l’équipe plateforme / sécurité.
# Inspection lecture seule (utilisateur CI) sysctl kern.maxfiles kern.maxfilesperproc ulimit -n # Exemple de relève temporaire (à valider avant industrialisation) sudo sysctl -w kern.maxfiles=200000 sudo sysctl -w kern.maxfilesperproc=65535 ulimit -n 65535
Coordination avec les verrous de build des gros monorepos
Les molettes de throttling n’ont de sens qu’avec un unique écrivain sur la promotion d’artefacts. Reprenez la séparation planificateur + flock décrite dans Nomad, affinité batch, verrous de build et matrice 1 To / 2 To ; suspendez les racines Watchman agressives pendant la détention du verrou pour éviter d’alimenter une tempête inutile sur l’arbre promu.
Seuil de décision : si l’attente moyenne sur verrou dépasse trois minutes sur deux releases consécutives, diminuez d’une unité le nombre de compilations lourdes par nœud avant d’incriminer la toolchain.
Recommandations de seuils d’alerte « niveau disque » (1 To vs 2 To)
Traitez l’occupation APFS comme porte de release pour une CI mixte Xcode / conteneurs sur hôtes Mac mini M4. Les pourcentages ci-dessous supposent un volume système principal sans montages externes « cachés » ; ajustez si la rétention réglementaire impose des instantanés longue durée.
| Occupation | Acceptation 1 To | Acceptation 2 To | Gravité d’alerte |
|---|---|---|---|
| < 70 % | Vert : concurrence standard ; rotation des logs hebdomadaire. | Vert : simulateurs supplémentaires possibles ; répartition entre nœuds. | Synthèse info uniquement. |
| 70–80 % | Jaune : planifier purge DerivedData ; geler nouveaux instantanés. | Jaune : revoir taille du préfetch d’artefacts par job. | Résumé astreinte hebdo ; pas de page immédiate. |
| 80–90 % | Rouge : planifier passage 2 To ou offload ; pause batch non essentiel. | Rouge : bloquer nouveaux jobs lourds jusqu’à retour de marge. | Ticket prioritaire ; pipelines à risque bloqués. |
| > 90 % | Échec build probable : artefacts partiels, hooks pré-build. | Stop promotions ; vidage de nœud si persistant. | Sev-1 ; gel des écritures cluster sur arbres partagés. |
Checklist d’acceptation : sonder l’espace libre APFS ; dédoublonner les alertes par hôte toutes les 5 min ; ouvrir un ticket capacité si le jaune dure 48 h ; appliquer les mêmes barrières aux jobs rsync sortants.
Runbook de déploiement en six étapes
- Mesurer le volume de notifications par job (logs Watchman), puis publier les
.watchmanconfigpartagés avec ignores validés en CI. - Fixer les plafonds de concurrence compilation par palier mémoire et enregistrer les histogrammes d’attente sur verrou après chaque release.
- Aligner sysctl et
ulimitdans les images dorées avant d’ajouter des nœuds inter-régions. - Brancher les sondes disque sur les bandes jaune / rouge ; refléter les alertes dans l’outil d’incident.
- Documenter le chemin de repli « sondage Git » pour les journées tempête ; lier depuis les playbooks du planificateur.
- Rejouer la matrice après chaque upgrade majeur Xcode ou image conteneur : les caches déplacent les seuils réels.
FAQ
Watchman remplace-t-il le planificateur ? Non : il alimente les outils incrémentaux ; placement et verrous restent orchestrés (Nomad, Jenkins, autre).
Pourquoi les tempêtes reviennent-elles ? Nouveaux chemins de couverture ou traces contournent les ignores — faites respecter une liste de racines interdites en CI.
Sondage Git à plein temps ? Lorsque la latence reste dans le SLO sans Watchman et que le CPU absorbe l’intervalle de poll sur toute la flotte.
Pour passer de la matrice papier à une ferme de Mac mini M4 bare metal (régions multiples, disque 1 To ou 2 To selon vos paliers), ouvrez la page achat, choisissez le forfait aligné sur votre marge disque et ajoutez un nœud lorsque la file CI dépasse le budget d’attente sur verrou — la facturation mensuelle évite un CAPEX matériel tout en gardant la même discipline Watchman / sysctl que sur vos runbooks internes.
Provisionnez des nœuds avec marge pour watchers et disques
Alignez les paliers 1 To ou 2 To sur la matrice « niveau disque », comparez les forfaits sans compte, puis louez du bare metal Mac mini M4 lorsque la file d’attente réclame une voie de compilation supplémentaire — le centre d’aide détaille les accès ; parcourez le blog pour les guides cluster (rsync, Nomad, DNS).