원격 Mac 클러스터가 워처·디스크 부담을 키우는 이유
원격 Mac 클러스터는 checkout·재빌드를 곱하고, 동일 트리에 에이전트가 몰리면 vnode가 먼저 터져 이벤트 스톰이 납니다. 상한 없이 두면 CPU가 링크 대신 무효화에 씁니다.
- 워처 팬아웃: 빌드 산출물·패키지 스토어까지 루트에 넣으면 병렬 에이전트마다 알림이 곱셈됩니다.
- 무제한 병렬: 공유 APFS에서 job 수를 안 막으면 IO 지터와 캐시 동시 무효화가 겹칩니다.
- 디스크 수위 표류: 시뮬레이터·컨테이너·골든 트리가 조용히 여유를 깎아 파이프라인 중간에 링크가 터집니다.
아티팩트 이동은 rsync·빌드 락·1TB/2TB 글과 맞추고, 도움말·기술 블로그에서 Nomad·DNS 글을 짝지으세요.
Watchman vs Git 폴링 대조(모노레포 CI)
Watchman은 증분 그래프용, 워처 압력이 튀면 Git 폴링이 지연을 삽니다. 풀마다 표로 기본값을 고정하세요.
| 신호 | Watchman 우선 | Git 폴링 우선 |
|---|---|---|
| 지연 목표 | ignore가 엄격하면 수백 ms급 무효화. | 수 초~수십 초; checkout 폭주에도 곡선이 완만. |
| M4 CPU(스파이크) | 루트가 좁으면 낮음; ignore 누수 시 급등. | 폴링 주기에만 예측 가능한 버스트. |
| 운영 리스크 | job 사이 watch-del-all 위생 필수. |
폴링 간격이 느리면 순간 편집을 놓칠 수 있음. |
| 클러스터 기본값 | Metro·RN·대형 JS 그래프 1차. | sysctl·스톰 SLO 실패 시 폴백. |
공유 풀에는 .watchmanconfig로 node_modules, Pods, build, SCM 객체를 제외하세요. 누락은 릴리스 파이프라인을 공유 노드에서 막습니다.
{
"ignore_dirs": [
"**/node_modules",
"**/.git/objects",
"**/Pods",
"**/DerivedData"
],
"settle": 20
}
스톰 카운터가 오르면 settle을 40–80 ms 쪽으로 올려 디바운스합니다.
sysctl·파일 시스템 한도와 스로틀 파라미터
워처 튜닝과 호스트 상한을 짝지어 한 job이 이벤트 스톰에서 디스크립터를 고갈하지 못하게 하세요. M4에서 병렬 팬아웃을 넓히기 전에 ulimit -n을 재측정합니다.
- 디스크립터: 오픈 파일 한도는 피크 핸들의 2배 이상; 부족하면 무거운 lane은 Git 폴링으로.
- 컴파일 스로틀: 16–24 GB 티어당 Swift·LTO 무거운 lane을 2~4개로 캡하고 락 대기가 줄 때까지 유지.
- 준비 단계 배치: 파일 시스템 무거운 단계를 묶어 Watchman이 미세 쓰기 대신 한 번의 버스트만 보게 합니다.
아래는 부트스트랩 예시입니다. 영구 반영은 운영과 sysctl.conf로 합의하세요.
# 읽기 전용 점검(CI 사용자 셸에서) sysctl kern.maxfiles kern.maxfilesperproc ulimit -n # 세션 상향 예시(영구 반영 전 운영 합의) sudo sysctl -w kern.maxfiles=200000 sudo sysctl -w kern.maxfilesperproc=65535 ulimit -n 65535
대형 저장소 빌드 락과의 협업
스로틀은 promote 단일 작성자와 맞물립니다. Nomad·flock·디스크 글을 따르고, 락 중엔 Watchman 루트를 좁히세요.
연속 두 릴리스에서 평균 락 대기가 3분을 넘기면 툴체인 의심 전에 컴파일 count를 1 낮춥니다.
디스크 수위 알람값 제안(1TB vs 2TB)
Mac Mini M4에서 Xcode·컨테이너가 섞인 CI는 APFS 이용률을 릴리스 게이트로 취급하세요.
| 이용률 | 1TB 수용 | 2TB 수용 | 알람 심각도 |
|---|---|---|---|
| < 70% | 녹: 표준 동시성; 주간 로그 로테이션. | 녹: 시뮬 추가 여유; 노드 간 분산 유지. | 정보 다이제스트만. |
| 70–80% | 황: DerivedData 비우기 일정; 신규 스냅샷 동결. | 황: job별 아티팩트 프리페치 크기 재검토. | 주간 온콜 요약 페이지. |
| 80–90% | 적: 2TB 승격 또는 오프로드 계획; 비핵심 batch 일시 중지. | 적: 여유 회복 전 신규 무거운 job 차단. | 즉시 티켓; 위험 파이프라인 차단. |
| > 90% | 빌드 실패 권고: 찢어진 아티팩트·훅 실패 가능성. | promote 하드 스톱; 지속 시 노드 드레인. | Sev-1; 공유 트리 쓰기 동결. |
검수: APFS 여유 프로브, 5분 중복 알람 제거, 황색 48h 지속 시 용량 티켓, rsync에도 동일 게이트.
롤아웃 런북(네 단계)
- Watchman 로그로 알림 베이스라인 후 공유
.watchmanconfigignore 배포. - 메모리 티어별 컴파일 캡·릴리스마다 락 대기 히스토그램 기록.
- 골든 이미지에 sysctl·
ulimit고정; 디스크 프로브를 황·적 구간에 연결. - Git 폴링 폴백을 플레이북에 링크; Xcode·컨테이너 메이저 업그레이드마다 매트릭스 재실행.
자주 묻는 질문
Watchman이 스케줄러를 대체? 아니요. 증분 신호만, 배치·락은 오케스트레이션.
스톰 재발? ignore 우회 경로를 CI 린트로 막으세요.
상시 Git 폴링? Watchman 없이 SLO 충족·플릿 CPU가 폴링을 감당할 때.
동형 Mac Mini M4 노드와 1TB/2TB 티어를 맞춘 뒤 구매·배포로 풀을 늘리고, 가격은 로그인 없이 비교하세요.