DevOps & audit 27 avril 2026

OpenClaw launchd : ThrottleInterval, KeepAlive et sondes de santé – matrice 2026 sur Mac mini loué

Équipe Ingénierie VmMac 27 avril 2026 ≈ 23 min de lecture

Les ingénieurs plateforme qui exécutent OpenClaw sous LaunchAgent sur un Mac mini Apple Silicon loué chez VmMac héritent de réglages subtils : ThrottleInterval masque les boucles de crash, KeepAlive ressuscite des processus empoisonnés, et la sémantique SuccessfulExit peut diverger des sorties Node pendant les mises à niveau. Cette matrice 2026 nomme des combinaisons sûres, explique les tempêtes de redémarrages faux positifs, décrit des sondes headless et relie l’observabilité à la parité Hong Kong, Japon, Corée, Singapour, États-Unis. Lisez aussi récupération de passerelle, isolation staging vs production et journaux structurés et rotation disque pour que les plist ne deviennent pas du bricolage.

Chemins de base : guide d’installation et de déploiement ; accès : aide ; hôtes canary dédiés : tarifs. Croisez les pics Spotlight/mds avec matrice d’indexation CI et disque avant d’incriminer OpenClaw.

Pourquoi la politique launchd prime sur la version binaire Node

Un semver OpenClaw parfait fond si launchd relance la passerelle toutes les 12 secondes parce que votre sonde confond latence LLM et mort. Les clés plist font partie du contrat SLA : elles définissent comment l’OS interprète succès, échec et backoff. Sans superviseur hyperviseur, launchd est le superviseur chez VmMac.

Les passerelles Node héritent de la sémantique des signaux macOS : SIGTERM pendant un déploiement doit fermer les serveurs HTTP, vider les journaux structurés et quitter avant que launchd n’escalade vers SIGKILL. Si le processus ignore SIGTERM car un WebSocket amont bloque, les shells interactifs voient des redémarrages manuels « réussis » tandis que les agents semblent instables. Documentez l’échelle de signaux attendue dans le même README que le pin Node LTS et répétez sur un mini VmMac jetable avant de toucher aux plist de prod.

ThrottleInterval ne remplace pas les correctifs de bugs—il ne change que le volume des échecs. Couplez le backoff OS à des disjoncteurs applicatifs pour qu’une configuration modèle empoisonnée ne sature pas le CPU dans toutes les régions. Par défaut, des chiffres identiques à Hong Kong, Tokyo, Séoul, Singapour et aux États-Unis ; exceptions écrites seulement pour expériences de latence.

  • ThrottleInterval plafonne la fréquence de redémarrage mais peut masquer des pannes partielles durables.
  • KeepAlive maintient les démons résidents mais complique le drain des mises à niveau.
  • ExitTimeOut fixe le budget d’arrêt gracieux avant SIGKILL.

Matrice : ThrottleInterval vs KeepAlive vs ExitTimeOut

Objectif Levier principal Risque Atténuation
Stopper les boucles de crash ThrottleInterval ≥ 30 s Récupération lente après vrais crashs Pager externe sur code de sortie
Passerelle toujours active KeepAlive true + SuccessfulExit false Respawn pendant un shutdown voulu Label de maintenance séparé
Drain gracieux ExitTimeOut 25–40 s Shutdown bloqué retarde le restart SIGKILL watchdog après budget
Éviter le troupeau après reboot StartCalendarInterval échelonné ou sommeil aléatoire dans le wrapper Préparation retardée vs pairs Porte de santé sur dépendances, pas sur l’horloge

Co-localisation avec d’autres agents launchd : envisagez Nice et LowPriorityIO pour qu’un expéditeur de logs n’affame pas la boucle d’événements de la passerelle. Ce n’est pas du dimensionnement, mais cela achète des minutes en incident partiel—souvent assez pour élargir ThrottleInterval délibérément.

Tempêtes de redémarrages faux positifs : symptômes et causes

Les tempêtes commencent souvent lorsque la santé frappe localhost avant que la passerelle n’ait lié les sockets après une pression disque qui retarde le chargement des modules. Autre motif : pics Spotlight/mds allongeant le cold start au-delà du timeout de sonde—corrélez avec politique d’indexation.

Garde-fou : ne fixez jamais l’intervalle de sonde à moins de le p95 de cold start sans porte de warmup.

Flapping des dépendances : si la sonde teste un SaaS externe avant la disponibilité loopback, des micro-coupures de routage au Japon ou à Singapour marquent la passerelle malade alors que le processus est sain. Couchez les sondes : loopback d’abord, canary externe optionnel avec timeouts plus souples.

Disque plein : JSONL jusqu’à ENOSPC, sortie non nulle, KeepAlive relance, les journaux échouent aussitôt—parfois plus vite que ThrottleInterval ne refroidit le système. Miroitez les garde-fous disque de rotation des journaux structurés.

Sondes de santé headless sans VNC

Utilisez un petit wrapper qui curl le port santé sur loopback—désactiver la vérif TLS uniquement en loopback—ou mieux la sous-commande status CLI d’OpenClaw. Journalisez statut HTTP, ms de handshake TLS et PID après la sonde pour distinguer « processus vivant mais coincé » de « processus mort ».

Émettez un en-tête synthétique X-Probe-Trace-Id et faites-le répercuter dans les logs passerelle pour lier échecs de sonde et requêtes lentes. Cette corrélation résout plus de Sev2 que tout ajustement plist.

curl -fsS --max-time 3 http://127.0.0.1:18789/health || exit 1

Échelle d’ajustement en huit étapes pour 2026

  1. Capturer les codes de sortie de référence pendant sept jours avant toute plist.
  2. Fixer ThrottleInterval pour stopper tout motif sous 20 s.
  3. Aligner ExitTimeOut sur le SLA documenté d’arrêt gracieux.
  4. Ajouter des journaux structurés pour chaque raison de redémarrage.
  5. Canary 72 h dans une région VmMac.
  6. Comparer les redémarrages HK, JP, KR, SG, US.
  7. Documenter la plist de rollback dans le tag git launchd-YYYYMMDD.
  8. Game day trimestriel : kill -9 et mesurer la récupération.

Entre les étapes quatre et cinq, figez les features sur le label canary 72 h même si les métriques sont vertes—beaucoup de tempêtes n’apparaissent qu’avec le trafic du week-end. Capturez sample et footprint pendant la fenêtre canary pour les régressions mémoire inter-régions.

Les articles de récupération décrivent quoi redémarrer ; cette matrice décrit quand l’OS doit redémarrer pour vous. Si les chiffres divergent, la confiance s’effrite et kill -9 devient habitude. Gardez les mêmes réglages numériques staging/prod selon isolation staging pour des promotions diffables.

Habitude chiffrée : pagez si les redémarrages dépassent 6 par heure pendant plus de 20 minutes—ce n’est presque jamais de la « variance LLM normale ».

Table d’observabilité : quoi journaliser par redémarrage

Champ But
launchd_exit_status Distinction OOM vs sortie propre
uptime_s Détecter la mortalité infantile
rss_mb Corréler fuites avant SIGKILL
fds_open Fuites de descripteurs amplifiées par keepalive
last_http_5xx_ts Séparer pannes amont et mort locale

Expédiez ces champs en JSONL vers le même réceptacle que les requêtes passerelle pour pivoter sans SSH sur chaque mini. Des noms cohérents à Hong Kong, au Japon, en Corée, à Singapour et aux États-Unis priment sur la cardinalité parfaite dès la première itération.

FAQ : launchd et OpenClaw sur Mac mini

LaunchDaemon plutôt que LaunchAgent ? Seulement après revue sécurité explicite—les agents héritent des frontières TCC utilisateur.

Tuner par région ? Uniquement avec exceptions écrites ; défaut = parité.

Mises à niveau ? Élargir temporairement ThrottleInterval pendant migrations npm.

SuccessfulExit false signifie-t-il toujours « redémarrer sur toute sortie » ? Effectivement pour la plupart des passerelles—associez des codes de sortie applicatifs drain vs crash.

Sondes en root ? Préférez le même utilisateur que la passerelle pour permissions et hypothèses TCC/trousseau.

Silencer les alertes en maintenance ? Fichier de maintenance lu par le wrapper, avec expiration automatique.

Pourquoi Mac mini M4 et VmMac conviennent aux passerelles toujours actives

Le Mac mini M4 offre assez de performance soutenue pour absorber des cold starts occasionnels sans déclencher des sondes agressives ; la mémoire unifiée réduit les flaps OOM vs VPS sur-souscrits. VmMac place les passerelles à Hong Kong, au Japon, en Corée, à Singapour et aux États-Unis près des utilisateurs et exigences de résidence des données—deuxième mini pour expérimenter les plist sans risquer la sémantique de redémarrage prod.

Louer raccourcit la boucle quand Apple livre des correctifs macOS qui modifient subtilement launchd : snapshot de la matrice plist, patch sur mini non-prod, rejouer le même harnais de santé avant d’impacter l’automatisation client. Moins cher qu’une astreinte nocturne pour politique de redémarrage non documentée.

Canary une nouvelle plist avant prod

Louez un Mac mini VmMac supplémentaire à Singapour ou Tokyo pour valider ThrottleInterval sans réveiller l’astreinte.