AI / 자동화 2026년 5월 19일

렌탈 Mac mini에서 OpenClaw MCP 자식 프로세스 잔류: 종료 위생과 launchd 복구(2026-05-19)

ProxyMac 엔지니어링 팀 2026년 5월 19일 약 18분 읽기

ProxyMac 홍콩·일본·한국·싱가포르·미국 리전의 Mac mini M4에서 OpenClawModel Context Protocol(MCP) stdio 서버를 함께 운영하는 팀은, 트래픽이 없는데도 RSS만 오르는 현상, node 행이 늘어나는 문제, 게이트웨이 업그레이드 이후 도구 호출만 불안정해지는 문제를 겪을 수 있습니다. 2026년 5월 19일자 본 문서는 고아 프로세스 누적JSON 라인 버퍼링 정체를 분리하고, 5열 운영자 매트릭스9단계 launchd 친화 청소를 제시합니다. 병렬 에이전트, stdio 버퍼링, 게이트웨이 복구와 상호 링크되어 온콜 런북에 그대로 붙여 넣을 수 있습니다.

증상: 스왑 전에 보이는 프로세스 표 드리프트

상위 이슈에서는 부모가 종료된 뒤에도 Node 자식이 수십 MB RSS를 붙잡고 남는 사례가 보고되었습니다. 단일 테넌트 베어메탈에서는 이웃이 없으므로 문제가 top과 launchd 통계에 그대로 드러납니다.

  • 행 수 드리프트: 밤새 SSH가 없었는데도 pgrep -lf mcp 결과가 콜드 부팅 직후보다 많다.
  • 계단형 지연: 첫 도구 호출은 성공하지만 이후 대기; 오래된 읽기 쪽이 파이프를 닫지 않는 전형입니다.
  • 버전 스큐: CLI만 최신이고 LaunchAgent 아래 게이트웨이는 이전 semver 자식을 안고 있다.
  • “모델 장애” 오탐: 공급자 지연은 정상인데 로컬 fork가 포화—항상 호스트를 먼저 의심하세요.
혼동 주의: JSON 줄이 끊긴 채 CPU가 평평하면 stdio 라인 버퍼를 먼저 보세요. 고아는 유휴 RSS 상승과 추가 PID가 단서입니다.

근본: stdio MCP가 “끈적 트리”를 만들기 쉬운 이유

stdio는 임의 TCP를 열지 않지만 POSIX 파이프 규칙을 그대로 받습니다. 쓰기 끝이 하나라도 열려 있으면 EOF는 오지 않습니다. npx가 손자만 남기는 패턴도 드물지 않습니다. LaunchAgent 환경은 대화형 셸보다 PATH·HOME이 빈약해 짧은 재시작 루프가 “CPU 공격”처럼 보일 수 있습니다.

ulimit·메모리 상한도 함께 읽으세요. 많은 macOS 워크로드에서 프로세스당 소프트 한도 2560개의 파일 디스크립터는 넉넉해 보이지만, 도구 호출이 “호출당 세 개의 파이프”를 쌓으면 중간에 반쯤 열린 디스크립터가 남아 고아화의 토양이 됩니다.

운영자 매트릭스(신호 → 조치)

1차 신호첫 조치(순서 엄수)보존 데이터오판 롤백에스컬
20분 만에 RSS가 약 200 MB 무단 증가먼저 ps -o pid,ppid,rss,command CSVPPID 체인과 JSONL 타임스탬프부 PID 확인 전 kickstart 금지플랫폼 SRE
관리 포트 이중 LISTEN게이트웨이 복구 단일 리스너 절차lsof -nP -iTCP:18999 -sTCP:LISTEN경쟁 plist bootout자동화 리드
429만 많고 CPU는 낮음병렬 가이드로 동시성 하향5분 버킷당 429 건수이전 maxConcurrentTasks 복원FinOps
RSS는 평탄한데 도구만 멈춤버퍼/PTY 조사, 즉시 SIGKILL 지양짧은 dtruss 샘플(정책 허용 시)unbuffer 실험 플래그 원복클라이언트 엔지니어

모든 조치를 작은 릴리스처럼 다루세요: 첫 신호 전에 기준선을 남깁니다(로드 애버리지, APFS 여유 공간, LLM 엔드포인트로 향하는 TCP 연결 수). 분당 도구 호출이 5회 미만인데 RSS만 단조로우면 원인은 거의 항상 로컬입니다. 게이트웨이 프로세스 업타임과 MCP 자식 업타임을 비교하세요—차이가 크면 고아 가능성이 큽니다.

ProxyMac에서 홍콩·도쿄·서울·싱가포르·미국에 둔 Mac mini M4에서는 지연과 프로세스 위생을 함께 봐야 합니다. 로컬 파이프가 막혀도 마치 느린 모델처럼 보일 수 있습니다. 사고마다 UTC 타임라인, PID 체인, MCP 서버 이름, 정확한 launchctl 라벨을 담은 짧은 사후 보고를 작성하면 다음 장애 대응이 훨씬 빨라집니다.

여러 팀이 동일 인스턴스를 쓰면 ps·pgrep·경로 제한된 lsof 같은 읽기 전용 진단 명령을 표준화하고, 파괴적 조치는 소수 온콜에게만 허용하세요. 게이트웨이가 기대하는 Node 메이저와 각 MCP 서버가 실제로 띄우는 버전도 기록하세요—메이저 점프는 종종 “프로세스 멈춤”처럼 보입니다.

운영 지표: 설정에 새 MCP 서버를 추가하지 않았는데 8시간 가동 후 argv에 mcp 또는 modelcontextprotocol가 포함된 node 수가 콜드 부트 대비 300 % 이상 늘었다면 정상 부하가 아니라 Sev-2 위생 이슈로 취급하세요.

알림 채널에는 RSS 그래프 스크린샷보다 수치 3개(콜드 부트 대비 node 수, 게이트웨이 RSS, 분당 도구 호출)을 함께 붙이면 재현 논쟁이 줄어듭니다. 장애 후에는 도움말의 SSH 절차와 충돌하지 않는지 확인하고, 동일 증상이면 가격 페이지에서 격리용 추가 mini를 먼저 검토하는 편이 장기적으로 저렴할 수 있습니다.

9단계 클린 런(SSH 세션)

  1. 유지보수 공지: 90초라도 CI 영향이 있으면 채널에 남깁니다.
  2. 증거보내기: 게이트웨이 로그 마지막 500줄 + launchctl print gui/$UID에서 OpenClaw 라벨 발췌.
  3. 신규 작업 정지: 웹훅·스케줄러를 잠시 멈춰 죽이는 동시에 생기는 레이스를 피합니다.
  4. 부모 매핑: PPID를 적고 launchd 관리 게이트웨이에 먼저 kill -9 하지 않습니다.
  5. SIGTERM 웨이브: MCP 잎에 보내고 15초 기다린 뒤 다시 셉니다.
  6. SIGKILL은 argv 검증된 대상만.
  7. 게이트웨이 재시작: 벤더 권장 launchctl kickstart -k 또는 bootout/bootstrap.
  8. 스모크: 읽기 전용 도구를 2번 호출하고 10분 안에 RSS가 기준선으로 돌아오는지 봅니다.
  9. 사후 분석: 주간 재발이면 PPID CSV를 첨부하고 본 문서 URL을 티켓에 넣습니다.
경영 메모: 중간 구성의 M4 게이트웨이는 유휴 RSS가 512 MB를 크게 밑도는 경우가 많습니다. 트래픽 제로인데 장기간 돌파하면 모델이 아니라 프로세스 위생을 의심하세요.

launchd 특유의 재순환 규율

ThrottleInterval·KeepAlive·SuccessfulExit 조합이 비정상 종료 후 얼마나 공격적으로 재시작할지를 정합니다. Node만 바꾸고 죽은 PTY에 오래된 stdio가 매달린 채면 launchd 눈에는 “건강”이어도 도구는 무작위로 실패합니다. launchctl printEffectiveUserID와 plist 소유자를 맞춰 보세요.

TCC·키체인 최초 승인이 필요하면 VNC로 GUI를 한 번 열고, 이후에는 도움말에 맞춰 헤드리스 SSH로 돌아옵니다. GUI 승인과 무인 launchd를 한 호스트에 섞으면 MCP 서버가 이중 기동되기 쉽습니다.

예방: 동시 실행·타임아웃·폭발 반경

고아를 안 낳는 편이 저렴합니다.

  • 큐 깊이·나이를 로그에 노출하고 병렬 OpenClaw 패턴에 맞춰 백프레셔를 설계합니다.
  • 서버마다 하드 타임아웃(키 이름은 릴리스마다 다름): 네트워크형은 120초, 가벼운 stat은 15초부터 시도합니다.
  • 자동화 페르소나별 작업 디렉터리를 나눠 git·패키지 매니저 잠금 경쟁을 피합니다.
  • 실험 MCP와 프로덕션 오케스트레이션을 다른 mini로 분리합니다. HK/JP/KR/SG/US 선택은 가격 페이지만으로 끝납니다.

FAQ

게이트웨이를 멈췄는데도 MCP stdio 서버가 남는 이유는? 강제 종료로 시그널 연쇄가 끊기거나 npx가 만든 중간 셸보다 손자 Node 프로세스만 살아남으면 MCP 자식이 고아가 됩니다. KeepAlive LaunchAgent가 새 게이트웨이를 즉시 띄우면 오래된 파이프가 열린 채로 남아 도구만 불안정해 보일 수 있습니다.

프로덕션 ProxyMac 미니에서 고아 MCP를 kill 해도 되나요? 먼저 SIGTERM을 보내고 ps·lsof 증거를 남기며 argv가 MCP인지 확인한 뒤 SIGKILL을 검토하세요. 공유 호스트에서는 열린 파일을 확인해 동료 세션을 죽이지 않도록 하고, 재시작 후 lsof로 관리 포트 LISTEN이 하나인지 확인합니다.

stdio 라인 버퍼링 교착과 무엇이 다른가요? 버퍼 문제는 JSON 줄이 끊긴 채 CPU가 평평한 경우가 많습니다. 고아 누적은 유휴 상태에서도 RSS와 node 프로세스 수가 계속 늘어납니다. 전자는 PTY·unbuffer 플래그, 후자는 동시 실행 한도·타임아웃·게이트웨이 재순환 규율을 조정합니다.

MCP 부작용 containment에 ProxyMac Mac mini가 맞는 이유

MCP는 호출마다 fork와 fd를 늘립니다. Apple Silicon M4는 단일 스레드 성능과 전력 효율로 여유를 주고, macOS는 데스크톱 자동화와 동일한 전제를 유지합니다. HK / JP / KR / SG / US 중 어디에 두느냐로 SaaS·레지스트리 왕복이 짧아집니다. ProxyMac 렌탈이면 더러운 프로세스 트리째로 버릴 랩 mini를 같은 가격 페이지에서 추가하고 CAPEX 없이 위생 주기를 돌릴 수 있습니다. 운영 절차는 도움말의 SSH/VNC 절과 맞추세요.

위험한 MCP는 전용 금속으로 격리

HK/JP/KR/SG/US Mac mini로 OpenClaw+MCP 랩 구축