2026-05-15 LaunchAgent OpenClaw ThrottleInterval, KeepAlive et SuccessfulExit sur Mac mini ProxyMac loué : ne pas confondre boucles de crash et pannes modèle
Les équipes qui exécutent OpenClaw en LaunchAgent sur des Mac mini M4 loués à Hong Kong, au Japon, en Corée, à Singapour ou aux États-Unis connaissent le schéma : la passerelle se termine, launchd la relance en moins d’une seconde, les API d’inférence renvoient 429 ou des flux vides, et tout le monde accuse « le modèle ». Cet article s’adresse aux opérations et plateformes : (1) filtres d’audience et seuils quantitatifs, (2) distinction boucles de crash vs throttling côté fournisseur, (3) une matrice décisionnelle à quatre lignes pour ThrottleInterval, KeepAlive et SuccessfulExit, (4) un runbook en neuf étapes aligné sur récupération après redémarrage et isolation dev/staging/prod, (5) un tableau de scénarios pour les rafales HTTP 429, (6) les pièges quand ThrottleInterval vaut 0. À lire avec ulimit & mémoire, jobs sans présence, proxy HTTP d’entreprise dans le plist. SKU sur tarifs, modèles d’incident sur aide, dialogue de confiance GUI ponctuel via VNC.
Qui doit absolument régler ThrottleInterval et KeepAlive pour OpenClaw
Commencez lorsque la passerelle peut quitter pour des raisons sans lien avec la qualité du modèle—JSON de configuration corrompu, segfault d’enfant MCP, rotation TLS MITM ou fichier token disparu pendant un déploiement. Si le plist LaunchAgent omet ThrottleInterval, macOS peut autoriser des respawns si rapides qu’aucun opérateur SSH ne retenterait ainsi. Inversement, KeepAlive sans sémantique de sortie documentée peut relancer immédiatement un arrêt de maintenance « réussi ».
- Seuil quantitatif : si
log show --predicate 'process == "launchd"' --last 15mdépasse 12 démarrages pour le même label, vous êtes en boucle de crash. - Seuil fournisseur : si les 429 corrèlent aux horodatages de redémarrage à ±5 s, ralentissez d’abord les relances automatiques avant de toucher à la température du modèle.
- Seuil d’isolation : les flottes multi-environnements ne partagent jamais un label plist—appliquez la règle un environnement / un label du guide d’isolation avant de modifier le throttle.
Symptômes : boucles de crash vs throttling fournisseur
Les boucles de crash montrent souvent une CPU en dents de scie : 0 % au repos, 180 % pendant ~8 secondes au boot OpenClaw, sortie brutale, répétition. Le throttling fournisseur affiche une CPU plus stable avec des lignes retry-after ou des indices de backoff exponentiel. Des JSONL dont la bannière de tête est identique sur de nombreux fichiers suggèrent que le processus n’atteint jamais l’état stable. Avant d’ouvrir un ticket chez le fournisseur, alignez la cadence de redémarrage sur l’horodatage du plist via stat -f '%m' ~/Library/LaunchAgents/com.example.openclaw.plist et comparez aux motifs de diagnostic JSONL.
launchctl print, (2) histogramme HTTP des logs passerelle, (3) codes de sortie des enfants MCP—si MCP est stable et HTTP surtout 429, ralentissez d’abord les relances automatiques.
Matrice : ThrottleInterval vs KeepAlive vs SuccessfulExit
| Clé | Ce qu’elle contrôle | Quand augmenter / activer | Risque principal si mal réglée |
|---|---|---|---|
ThrottleInterval (secondes) |
Délai minimal entre redémarrages automatiques après sortie | Après tempêtes 429 ou MCP instable en rollout | Trop haut masque une vraie récupération pendant incident |
KeepAlive true |
Relancer le job à la sortie (selon sémantique plist) | Passerelles longue durée devant survivre aux reboots | Respawn infini sans throttle brûle les quotas |
SuccessfulExit false |
Avec KeepAlive, traiter la sortie 0 comme succès sans relance auto | Fenêtres de maintenance avec scripts sentinelles | Booléen inversé laisse des boucles zombie |
launchctl kickstart -k manuel |
Redémarrage opérateur hors cadence de throttle | Déploiement contrôlé après validation plist | Automatisation en boucle serrée sur kickstart reproduit la tempête |
Runbook de stabilisation en neuf étapes
- Audit des labels : une seule plist possède OpenClaw prod, conformément à l’isolation.
- Capturer la tempête de sorties : exporter les 200 dernières lignes du log unifié filtrées par label.
- Throttle de base : 10 s en dev, 30 s en prod après premier cluster 429.
- Définir SuccessfulExit : documenter la sortie 0 comme arrêt gracieux dans les scripts de mise à niveau.
- Aligner les plafonds mémoire : avec l’article ulimit pour que l’OOM ne paraisse pas être un réseau.
- Supprimer le bruit webhook : avec Slack, débouncer les alertes pendant que le throttle refroidit le processus.
- Injection de faute : déplacer brièvement un fichier de config non secret et vérifier l’espacement des relances.
- Soak : 45 minutes de trafic synthétique à 40 % du parallélisme de pic pour détecter un watchdog externe qui double-démarre.
- Post-mortem : archiver diff plist et histogramme de redémarrage dans le même Git que la versioning de config.
ThrottleInterval à 0 sur des mini partagées avec clés API prod—votre crash devient l’histoire de limitation de tout le monde.
Tableau de scénarios : rafales HTTP 429 vs comportement launchd
| Scénario | Pattern observable | Premier levier |
|---|---|---|
| Boucle segfault MCP | Code 139 toutes les 2–4 s | ThrottleInterval à 30 ; corriger le chemin MCP |
| Race fichier token au déploiement | 6 sorties 78 puis succès | Mutex de déploiement ; ThrottleInterval ≥ 15 |
| Throttle global fournisseur | 429 avec Retry-After: 60 |
ThrottleInterval ≥ 60 ; réduire les agents parallèles |
Bug script opérateur kickstart -k |
Démarrage toutes les 60 s même sain | Retirer le wrapper cron ; KeepAlive + sonde de santé |
Pièges : ThrottleInterval à zéro et double watchdog
Certains plists copiés gardent ThrottleInterval 0 depuis des modèles pour daemons interactifs. OpenClaw avec KeepAlive agressif épuise alors les descripteurs de fichiers en sub-seconde, ce qui apparaît comme erreurs MCP 24 sans défaut logique d’outil. Un second piège : cron externe invoquant launchctl kickstart pendant que KeepAlive est true double-démarre en phase saine. Une seule couche de supervision.
defaults read /path/to.plist ThrottleInterval
FAQ
ThrottleInterval ralentit-il les déploiements normaux ? Il impose seulement un délai minimal entre relances automatiques après sortie. Les launchctl kickstart manuels ne sont pas soumis à ce throttle.
Faut-il KeepAlive true pendant un canary ? Souvent oui pour les passerelles longues durée, mais coupler avec ThrottleInterval ; le canary utilise un label plist séparé.
Quel code pour SuccessfulExit en maintenance ? Le sentinelle du wrapper—souvent 0—documenté à côté du plist.
Pourquoi le Mac mini ProxyMac est le bon lieu pour discipliner launchd
Les Mac mini M4 loués offrent un CPU mono-locataire prévisible pour séparer throttling thermique et tempêtes de redémarrage, un syslog macOS natif identique aux portables des développeurs, et le choix de région HK / JP / KR / SG / US pour rapprocher les tests de latence des bases utilisateurs réelles. Une fois la math du throttle validée, promouvez les mêmes extraits plist via des tarifs transparents vers une seconde mini plutôt que de deviner sur des runners CI partagés qui masquent launchd.
Durcir OpenClaw launchd avant que les quotas mordent
ThrottleInterval · KeepAlive · HK / JP / KR / SG / US