-parallel-testing-enabled·destination·노드당 Simulator 예산을 빌드 락·경로·1TB/2TB 검수에 묶은 슬러그 예: 2026-xcode-parallel-testing-cluster-m4-disk.html.
동형 노드를 리전에 더하면 두 잡이 같은 쓰기 트리를 두고 싸우거나, destination만 늘려 CoreSimulator가 뒤엉키는 일이 납니다. destination 팬아웃과 잡 단위 병렬은 따로 캡을 두세요. 《Watchman·Git·디스크 수위》와 아래 표를 같이 맞추면 이벤트 폭주에도 안정적입니다.
파라미터 표: -parallel-testing-enabled · destination 수 · Simulator 동시성
-parallel-testing-enabled YES는 한 호출에 여러 destination으로 테스트를 퍼뜨립니다. 프로세스당 destination과 노드당 Simulator 부트는 별도 캡이어야 하며, 여유 없이 destination만 올리면 메모리·부트·스냅샷 IO가 먼저 막힙니다. 노드·스킴 분할이 숫자만 키우기보다 낫습니다.
-parallel-testing-enabled |
destination 수 (프로세스당, 경험칙) | Simulator 동시 예산 (노드당) |
|---|---|---|
| NO (단일 레인 기본) | 1 (-destination 단일) |
가동 기기 1–2; 공유 호스트에서는 UI 테스트는 1로 고정 권장. |
| YES, 유닛 비중 높음 | 2–3 (동일 SDK·호환 런타임군) | 부트 2–3대를 시차 배치; 동시 잡 수는 별도 캡으로 곱셈 폭주 방지. |
| YES, UI·스냅샷 혼합 | ≤2 (destination 올리기 전에 노드 병렬로 스케일아웃) | 2대 고정 + 메모리 알람; 크로스 리전은 피크 팬아웃보다 재현성 우선. |
공유 볼륨의 DB를 건드리는 단계가 있다면 《SQLite WAL·단일 작성자 매트릭스》와 작성자 규칙을 맞춰 Parallel Testing 뒤에 숨은 WAL 체크포인트 폭풍을 만들지 마세요.
빌드 락
같은 Derived Data·산출 트리에 동시 xcodebuild가 쓰면 캐시가 깨져 플레이크가 납니다. 빌드 락은 게시 구간 단일 작성자 계약입니다. 스케줄러 직렬화(Nomad promote 한 할당 등)와 flock은 상호보완이며, 배치는 《Nomad·빌드 락·디스크 매트릭스》와 동일 의미로 맞추면 됩니다.
LOCK_FILE="/var/tmp/xcode-derived-publish.lock"
flock -n "$LOCK_FILE" bash -c '
xcodebuild -scheme "$SCHEME" -parallel-testing-enabled YES test
rsync -a "$LOCAL_DERIVED/Build/Products/" "/Volumes/CIArtifacts/$BUILD_ID/"
' || { echo "lock busy"; exit 17; }
컴파일과 대부분의 Derived Data 작업은 락 밖에 두고, 서명·원자적 rename·정식 트리 갱신만 안쪽에 넣으세요. 락이 필요한 트리에 SSHFS는 피하고 APFS 로컬이나 락 의미가 문서화된 네트워크 파일시스템을 쓰세요.
Derived Data 경로
공유 CI에서는 잡 범위 -derivedDataPath(파이프라인 ID 등)로 쓰기 인덱스를 분리하고 산출물만 rsync·아카이브하세요.
- CI 변수: 잡 ID 기반 경로, 실패 워크스페이스 적극 삭제.
- Simulator: CoreSimulator·런타임 디렉터리를 별도 지표로 추적.
- 읽기 캐시: 가변 캐시 공유 시 프로덕션과 동일 flock 규율.
크로스 리전 승격 시 컴파일 노드 Derived Data는 로컬, 권위 경로는 문서화하세요.
디스크 정리 임계·수위
Parallel Testing은 중간 산출·로그·시뮬레이터 데이터를 빠르게 불립니다. 1TB·2TB 모두 이용률 밴드 퍼센트는 비슷하게 두고, 2TB는 런타임 비대까지 시간만 법니다.
| 이용률 밴드 | 1TB: 조치 | 2TB: 조치 |
|---|---|---|
| ~70% 이하 | xcrun simctl delete unavailable 자동화, 오래된 Derived Data 세대 정리, CI temp 주간 스윕. |
동일 케이던스—여유가 있다고 위생을 미루지 않습니다. |
| 70–80% (노랑) | 이번 스프린트에 확장 또는 아카이브 오프로드 계획; -parallel-testing-enabled destination 캡과 동시 잡을 낮춥니다. |
노랑은 늦게 보이는 경우가 많습니다. destination을 다시 올리기 전에 Simulator 동시성·잡 팬인을 줄이세요. |
| 80–90% | 무거운 UI 스위트·전체 클린 빌드 동결; 여유가 돌아올 때까지 아티팩트 동기 페이로드 축소. | 먼저 안 쓰는 런타임 제거—2TB 클러스터는 런타임 비대까지 가려 두다 절벽에 닿습니다. |
| ~90% 초과 (빨강) | 신규 테스트 팬아웃 중단; 스토리지 교체·증설; APFS 스냅샷·숨은 볼륨 감사; 수위는 대시보드에 상시 표시. | |
검수(발췌): 주간 df·Simulator 발자국; -derivedDataPath 무충돌; 캡은 런북에 버전 고정; 노랑·빨강은 티켓·용량 검토. 플랜 비교는 기술 블로그와 하단 공개 링크를 사용하세요.
자주 묻는 질문
destination을 올렸는데 빨라지지 않음: Simulator·메모리·디스크 포화 → 노드 분할·동시성 축소 후 재조정.
flock busy: 락 구간을 서명·최종 게시로만 축소.
2TB도 금방 노랑: 베타·런타임 다벌 → 퍼센트는 동일, 런타임 폐기만 강화.