IA / Automatisation 19 mai 2026

Sous-processus MCP orphelins OpenClaw sur Mac mini loué : hygiène de sortie et recycle launchd (2026-05-19)

ProxyMac Engineering Team 19 mai 2026 ~18 min de lecture

Les équipes qui combinent OpenClaw et des serveurs MCP stdio sur des Mac mini M4 loués dans les régions Hong Kong, Japon, Corée, Singapour ou États-Unis via ProxyMac observent parfois une RSS qui monte au repos, des lignes node supplémentaires ou des outils erratiques après une mise à jour de passerelle. Ce guide du 19 mai 2026 sépare l'empilement d'orphelins des blocages de buffering JSON, propose une matrice opérateur à cinq colonnes et un runbook launchd en neuf étapes. Liens utiles : agents parallèles, buffering stdio, relance passerelle.

Symptômes : dérive de la table des processus avant swap

Les rapports publics mentionnent des enfants Node qui conservent des dizaines de mégaoctets RSS après la fin du parent. Sur métal mono-locataire, le signal apparaît immédiatement dans top et les journaux launchd.

  • Dérive du nombre de lignes : pgrep -lf mcp retourne plus de résultats après une nuit sans SSH.
  • Latence en escalier : premiers appels réussis, suivants bloqués ; lecteur fantôme sur un tube.
  • Décalage de version : CLI à jour, passerelle LaunchAgent plus ancienne.
  • Faux « modèle cassé » : latence fournisseur saine mais fork local saturé.
Ne confondez pas : JSON partiel + CPU plat ⇒ lisez buffering stdio. Orphelins ⇒ RSS inactive en hausse et PID en surplus.

Causes : pourquoi stdio MCP colle aux arbres de processus

Le transport stdio évite les ports TCP aléatoires mais conserve les règles POSIX : tant qu'une extrémité d'écriture reste ouverte, pas d'EOF. Les lanceurs npx peuvent laisser des petits-fils vivants. Sous LaunchAgent, PATH et HOME diffèrent du shell interactif, ce qui peut provoquer des boucles de redémarrage bruyantes.

Lisez aussi ulimit et mémoire : la limite souple typique de 2560 descripteurs de fichiers semble large jusqu'à ce que chaque appel d'outil multiplie les tubes ouverts.

Matrice opérateur (signal → action)

Signal principalPremière action (ordre strict)Données à archiverRollbackOwner
+200 MB RSS en ~20 min sans chargeExporter ps -o pid,ppid,rss,command en CSVChaîne PPID + horodatages JSONLNe pas kickstart avant d'étiqueter le parentSRE plateforme
Double LISTEN sur le port adminSuivre relance passerelle (un seul auditeur)lsof -nP -iTCP:18999 -sTCP:LISTENRetirer le plist concurrentLead automatisation
429 massifs, CPU basRéduire la concurrence (guide parallèle)429 par fenêtre de 5 minutesRestaurer l'ancien maxConcurrentTasksFinOps
RSS plate mais outils gelésInspecter PTY/buffering, éviter SIGKILL immédiatÉchantillon dtruss si politique OKRevenir aux flags précédentsIngénieur client

Traitez chaque intervention comme une mini-release : avant le premier signal, capturez des repères (load average, espace APFS libre, compteur de connexions TCP vers l’endpoint LLM). Si la RSS monte de façon monotone alors que le débit d’appels d’outils reste sous 5 par minute, la cause est presque toujours locale—pas le fournisseur d’inférence. Comparez aussi l’uptime du processus passerelle avec celui des enfants MCP : un écart important suggère fortement des sous-processus orphelins.

Sur un Mac mini M4 loué chez ProxyMac à Hong Kong, Tokyo, Séoul, Singapour ou aux États-Unis, reliez latence régionale et hygiène : un saut d’océan supplémentaire entre outil et API ressemble à un « modèle lent » alors qu’un simple tuyau local bloque. Après chaque incident, remplissez un court post-mortem avec timeline UTC, chaînes PID, noms de serveurs MCP et label launchctl exact—vous gagnerez des heures lors de la prochaine alerte.

Si plusieurs équipes partagent la même instance, publiez une liste de commandes de diagnostic en lecture seule (ps, pgrep, lsof avec chemins restreints) et réservez les actions destructrices à une garde restreinte. Notez aussi la majeure Node attendue par la passerelle versus celle réellement lancée par chaque serveur MCP—les sauts majeurs imitent souvent des blocages de processus.

Chiffre opérationnel : si le nombre de processus node contenant « mcp » ou « modelcontextprotocol » dans l’argv augmente de plus de 300 % après 8 h d’exploitation stable sans nouveau serveur déclaré, traitez l’événement comme une hygiène Sev-2, pas comme une charge nominale.

Runbook propre en neuf étapes (session SSH)

  1. Annoncer la fenêtre même courte pour éviter les surprises CI.
  2. Exporter les preuves : 500 dernières lignes de log passerelle + extrait launchctl print gui/$UID.
  3. Geler l'entrée : webhooks et planificateurs en pause.
  4. Cartographier PPID : ne pas kill -9 la passerelle supervisée avant classification.
  5. Vague SIGTERM : attendre 15 secondes puis recomptage.
  6. SIGKILL ciblé seulement après validation argv.
  7. Recycler la passerelle : launchctl kickstart -k ou bootout/bootstrap selon le fournisseur.
  8. Fumée : deux appels d'outil en lecture seule, vérifier RSS sous 10 minutes.
  9. Post-mortem : si hebdomadaire, joindre le CSV PPID et l'URL de cet article.
Repère budget : une passerelle M4 idle reste souvent bien en dessous de 512 Mo RSS ; une croissance prolongée sans trafic pointe vers l'hygiène processus, pas vers un modèle plus lourd.

Discipline launchd : ThrottleInterval et recycle

ThrottleInterval, KeepAlive et SuccessfulExit dictent l'agressivité des relances. Remplacer uniquement le binaire Node en laissant d'anciens stdio accrochés à un PTY mort produit une passerelle « verte » mais des outils aléatoirement cassés. Vérifiez EffectiveUserID via launchctl print.

Pour TCC ou trousseau, ouvrez une session VNC ponctuelle puis revenez au SSH sans tête décrit dans l'aide. Mélanger validations GUI et cycles launchd sans surveillance double trop souvent les serveurs MCP.

Prévention : concurrence, timeouts, rayon d'explosion

  • Exposez profondeur et âge de file ; alignez-vous sur OpenClaw parallèle.
  • Timeouts durs par serveur : 120 s pour outils réseau, 15 s pour stat légers (ajuster selon clés produit).
  • Répertoires de travail distincts par persona d'automatisation.
  • Séparez mini de labo et mini de prod ; choisissez HK/JP/KR/SG/US sur la page tarifs.

FAQ

Pourquoi des serveurs MCP stdio survivent après l'arrêt de la passerelle ? Arrêts brutaux, chaîne SIGTERM incomplète ou petits-fils Node lancés via npx peuvent survivre au shell intermédiaire. Un LaunchAgent KeepAlive relance une nouvelle passerelle pendant que d'anciens descripteurs de tuyaux restent ouverts, ce qui ressemble à une panne d'outils alors que la latence modèle reste saine.

Puis-je tuer des PID MCP orphelins en production sur un mini ProxyMac ? Envoyez SIGTERM d'abord, archivez ps/lsof, vérifiez la ligne de commande, puis seulement SIGKILL en dernier recours. Sur hôte partagé, contrôlez les fichiers ouverts pour ne pas casser la session d'un collègue. Après redémarrage, assurez-vous qu'un seul LISTEN occupe le port d'administration.

Différence avec un blocage de buffering stdio ? Le buffering laisse des lignes JSON partielles avec CPU plat. L'accumulation d'orphelins montre une RSS qui grimpe et davantage de binaires node au repos. Le premier cas demande PTY/drapeaux non bufferisés ; le second impose plafonds de concurrence, timeouts et discipline de recycle de passerelle.

Pourquoi un Mac mini ProxyMac isole mieux les effets MCP

Chaque outil MCP multiplie forks et descripteurs. Apple Silicon M4 offre la marge single-thread, macOS aligne l'automatisation sur votre poste de travail, et les nœuds HK / JP / KR / SG / US rapprochent les SaaS testés. Le modèle locatif ProxyMac permet un mini laboratoire jetable référencé sur la même page tarifs que la production, sans cycle d'achat matériel pour une dette purement logicielle. Gardez les procédures cohérentes avec l'aide SSH/VNC.

Isolez les MCP risqués sur du métal dédié

Louez des Mac mini HK/JP/KR/SG/US pour lab OpenClaw + MCP