2026 Mac 클라우드 CI: 콜드 스타트 vs 웜 노드, 큐 백오프·DerivedData 어피니티·상주 베이스라인 실행 가이드
GitHub Actions YAML에 익숙한데도 첫 빌드는 느리고 둘째는 빠르며 셋째는 다시 느리다면 Xcode보다 콜드 캐시 미스와 단일 DerivedData 루트 경쟁을 의심하세요. 이 글은 2026년 Mac 클라우드를 VPS처럼 SSH·launchd로 다루는 플랫폼 팀을 위해 네 가지 통증, 세 형태의 비교표, 어피니티·백오프 파라미터, 재무 설명에 쓸 세 지표, 다섯 단계 롤아웃과 FAQ를 정리합니다. 탄력 풀·상주 베이스라인 라우팅 글과 함께 읽으면 이중 설계가 선명해집니다.
목차
1. 통증: 분산, 어피니티 부재, 백오프 부재, 관측 편향
Mac 클라우드 노드를 CI에 붙이면 Linux VPS와 같은 SSH·launchd·디스크·출구 제어를 기대합니다. 그러나 대형 Swift 모듈은 NVMe 지역성에 민감해, 모든 러너가 하나의 DerivedData를 공유하면 콜드 스타트 분산이 컴파일러 퇴보처럼 보입니다.
- 콜드 스타트 꼬리: 첫 checkout 이후 의존성 해석·인덱스 예열·링크 단계가 P95를 늘립니다. 총 분만 보면 코드 비대로 오인하기 쉬우나 실제는 캐시 미스입니다.
- 어피니티 공백: 같은 브랜치 연속 빌드가 다른 물리 볼륨에 떨어지면 증분 이득이 사라집니다. 툴체인 업그레이드 탓으로 착각하기 쉬우나 경로 드리프트가 본질입니다.
- 백오프 공백: Archive를 max parallel·지수 백오프 없이 동시에 돌리면 NVMe 큐가 포화되어 링크 타임아웃형 플래키로 보입니다.
- CPU만 보는 대시보드: macOS CI는 IO·메타데이터가 1순위입니다. 여유 공간과 링크 히스토그램을 무시하면 회의는 늘 코어 추가로 귀결됩니다.
2. 의사결정표: 콜드 풀, 웜 호스트, 상주 베이스라인
이 표는 탄력 풀+베이스라인 글을 보완하며, Mac 내부의 디렉터리·동시성을 정합니다. 과금 매트릭스도 함께 보세요.
| 축 | 콜드 우선(짧은 버스트) | 웜(반상주 캐시) | 상주 베이스라인(전용 슬롯) |
|---|---|---|---|
| 전형 부하 | lint, 단위, 가벼운 행렬 | 중간 규모 증분 PR | Archive, 공증, 긴 UI |
| 꼬리 민감도 | 탄력과 맞바꾼 분 과금 | P95 안정, 드물게 마이그레이션 허용 | 링크 분산 최소화 |
| 디스크 전략 | 잡별 하위 디렉터리+야간 gc | sticky 경로 또는 짧은 골든 스냅샷 | 빌드/아티팩트 이중 파티션 |
| 큐 전략 | 높은 동시성+엄격 재시도 상한 | 중간 동시성+깊이 임계 | 낮은 동시성+변경 창 |
3. DerivedData 어피니티와 스탬피드 방지
어피니티는 영구 동일 머신 ID가 아니라 통계적으로 재사용 가능한 모듈 캐시입니다. 동시성 슬롯마다 DERIVED_DATA_PATH를 분리하고 Archive와 PR 증분을 나누며, 여유 공간이 약 15% 미만이면 신규 Archive를 막는 실무 삼각주가 됩니다.
export DERIVED_DATA_PATH=/Volumes/ci/d12/$JOB_SLOT/dd
export COCOAPODS_CACHE_PATH=/Volumes/ci/d12/$JOB_SLOT/cocoapods
xcodebuild -scheme App -destination 'platform=iOS Simulator,name=iPhone 16' build
링크 단계 재시도는 무료 복구 손잡이가 아니라 예산입니다. 재시도는 신규 잡과 같은 NVMe 대역을 먹으므로 동시성을 줄이지 않고 간격만 넓히면 온콜 부담만 이동합니다. PR 증분은 캐시 히트 시 짧은 간격으로 몇 번까지 허용하고, Archive는 1~2회에 지수 백오프를 얹으세요.
4. 다섯 단계 롤아웃
- 작업 분류: 콜드·웜·상주로 나누고 큐·컴파일·링크·업로드 비중을 잽니다. 링크 비중이 튀면 CPU 구매 전에 DerivedData 경쟁을 봅니다.
- 경로 계약: JOB_SLOT·self-hosted 라벨·디렉터리 매핑을 문서화하고 실험 브랜치의 공유 루트 직쓰기를 금지합니다.
- 동시성 게이트: Archive 전역 max parallel 1~2, PR은 높여도 백오프 곡선을 붙입니다.
- 알림 배선: 여유 공간·큐 깊이·재시도 분 비중을 관측성 글과 같은 대시보드에 올려 사용자 플래키 전에 잡습니다.
- 삼중 빌드 검증: 동일 커밋을 세 번, P95와 실패 군집을 비교합니다. 분산이 남으면 동시성 확장보다 두 번째 베이스라인을 우선합니다.
5. 세 가지 인용 지표
- 큐 비중: end-to-end의 약 15%를 넘기며 커밋 빈도와 상관하면 풀 혼선 신호입니다.
- 링크 P95 편차: 동일 커밋 세 번에서 약 25% 이상 벌어지면 공유 DerivedData나 디스크 여유를 봅니다.
- 재시도 분 비중: 전체의 약 1/4을 재시도가 먹으면 백오프 부재나 게이트 과대입니다. 스케일아웃 전에 동시성을 내립니다.
6. 탄력 풀 글과의 관계
러너 라우팅이 1층이라면 이 글은 2층의 Mac 내부 파라미터입니다. 콜드가 분 스파이크를 흡수하고, 웜이 증분 체감을 다듬으며, 상주가 Archive를 예측 가능하게 합니다.
7. FAQ
Mac 한 대로 웜을 흉내 낼 수 있나요? 디렉터리 슬롯과 큐 깊이로 논리 웜은 가능하지만 마이그레이션 창은 남습니다. Archive는 낮은 동시성 전용 큐를 권장합니다.
어피니티와 보안이 충돌? 맹목적 sticky보다 멀티테넌트 분리를 우선하고 Unix 사용자·마운트를 나눕니다.
곧 분산 원격 캐시가 필요? 대개 NVMe 파티션과 잡 단위 경로를 바로잡는 편이 조기 캐시보다 분산을 줄입니다.
백오프를 리더에게? 상관 실패 보험으로, 짧은 의도 지연이 NVMe 큐를 비워 벽시계를 줄인다고 설명하세요.
8. 정리
콜드 자체는 악이 아니라 무제한 동시 스케줄링이 문제입니다. 웜과 상주는 꼬리 지연을 무작위가 아닌 조절 가능한 매개변수로 바꿉니다.
호스트 풀은 벤더 정책 아래 레이아웃 자유가 낮고, 작은 디스크에 콜드만 쌓으면 Archive와 PR이 같은 DerivedData를 밟습니다. 무거운 링크를 낮은 동시성 베이스라인으로 내려면 VPSMAC Apple Silicon Mac 클라우드를 임대해 Linux VPS식 SSH·launchd를 이어가는 편이 청구서 한 장에 스파이크를 눌러 담는 것보다 본질에 가깝습니다.