2026 Mac Mesh 공유 빌드 풀 디스크 워터라인
DerivedData 정리 및 3계층 캐시 Runbook

디스크 워터라인 · DerivedData / CocoaPods / Gradle · 3계층 산출물 · 6단계 Runbook · 하드 임계값

2026 Mac Mesh 공유 빌드 풀 디스크 워터라인 및 DerivedData 거버넌스

운영·모바일 인프라·공유 Mac 빌드 풀에 디스크 SLO를 계약하는 Tech Lead는 금요일 밤에 같은 유형의 알림을 자주 받습니다.Runner는 온라인인데 Job이「No space left」로 실패하고, DerivedData가 시스템 볼륨을 채우며, CocoaPods·Gradle 글로벌 캐시가 무주 상태이고, rsync 성공 후에도 산출물이 로컬에 남습니다.본문은 먼저 누가 어떤 문제에 직면하는지를 정의합니다.Mac Mesh 멀티테넌트 로테이션에서 디스크는 「가득 찬 뒤 수동 rm」이 아니라 관측 가능한 워터라인과 계층별 회수 계약이 없습니다.다음 결론: L1 DerivedData / L2 의존 캐시 / L3 CI 산출물 3계층 워터라인과 6단계 Runbook으로 정리를 진화·소화에서 감사 가능한 정례로 옮깁니다.구성은 5가지 숨은 비용, 정리 전략 대조표, 워터라인 스크립트 필드, 6단계 구현, 3가지 하드 임계값, FAQ입니다.시트·리스는 동시 시트·뮤텍스,이미지 드리프트는 골든 이미지 체크리스트,산출물은 rsync·오브젝트 스토리지, 풀 용량은 3풀 SLO 매트릭스, 다중 브랜치는 Git worktree 격리를 참고하세요.

01

공유 빌드 풀이 디스크 풀나기 전 흔한 5가지 「숨은 비용」

2026 Mac Mesh 티켓에서 디스크 이슈는 「100GB 부족」만이 아닙니다.테넌트 로테이션, 캐시 지역성, 산출물 수명 사이에 통일 계약이 없어 APFS 여유가 있어도 Xcode 임시 쓰기가 실패하는 경우가 많습니다.

  1. 01

    DerivedData 무경계 공유:여러 저장소가 ~/Library/Developer/Xcode/DerivedData 을 공유해 인덱스·ModuleCache가 브랜치마다 섞입니다.clean 한 번에 이웃 테넌트 ModuleCache를 오삭제해 디스크 풀이 아닌 무작위 link 실패로 나타납니다.

  2. 02

    CocoaPods / Gradle 글로벌 캐시 TTL 없음: ~/Library/Caches/CocoaPods~/.gradle/caches만 계속 증가합니다. Pods 업데이트 후에도 구 tarball이 수 GB 남고,worktree 다중 브랜치과 병행하면 경합이 커집니다.

  3. 03

    「업로드됐지만 로컬 잔류」:오브젝트 스토리지는 성공했는데 $CI_ARTIFACTS_DIR 에 보존 정책이 없고,rsync 완료 훅미연동으로 IPA/dSYM이 디스크를 잠식합니다.

  4. 04

    APFS 스냅샷과 「여유」 착각:로컬 스냅샷으로 df는 여유로 보이나 컴파일 피크에서 실제 쓰기가 붕괴합니다. 볼륨·계층별 waterline_used_pct 이 없습니다.

  5. 05

    정리와 시트 락 경합:리스 미해제 상태로 디렉터리를 스캔하거나 시트 락 TTL 과 충돌해 「디스크는 비었는데 빌드는 빨강」 2차 장애가 납니다.

산출물은 3계층 디렉터리 사전, warn/hard 이중 워터라인, 리스 종료 LRU, 골든 이미지 주간 드리프트 검사 분리입니다.하나라도 없으면 공유 풀에서 「임의 monorepo 병행」을 약속하면 안 됩니다.다음 절은 3가지 정리 철학을 대조해 「매주 금요일 전원 ssh rm -rf」를 피합니다.

02

대조표: 수동 정리, 워터라인 가드, 골든 이미지 리셋 선택

디스크 운영은 「세게 할수록 좋다」가 아니라,빌드 히트율, 정리 감사 가능성, 테넌트 격리 균형입니다.변경 리뷰에 아래 표를 붙이고 각 계층(L1/L2/L3) 기본 전략은 하나만 선택하세요.

전략L1 DerivedDataL2 Pods/GradleL3 산출물적합주요 리스크
수동 cron주말 글로벌 rm가끔 pod cache prune일수 기반 find 삭제초소형 팀·저병행이웃 오삭제·감사 불가
워터라인 가드workspace 해시 LRU용량 임계 evictrsync 성공 후 48h공유 풀 기본지표·락 계약 필요
이미지 리셋스냅샷 롤백이미지 갱신 동반볼륨 교체드리프트 실패·컴플라이언스콜드스타트 지연

선택 원칙: 공유 풀 기본값은 「워터라인 가드」입니다. 이미지 리셋은 골든 이미지 드리프트 목록과 결합한 분기 폴백만 가능하며 일상 LRU 대체는 아닙니다.

Dedicated 전용 풀과 Shared 로테이션이 공존하면 L1 캐시 키에 풀 유형 태그가 필요합니다. 없으면 전용 노드 지역성이 공유 풀 정리에 손상됩니다.

3계층 디렉터리안 (Runbook 첨부)

L1: /var/mesh/cache/deriveddata/{workspace_hash}, Xcode DERIVED_DATA_DIR에 바인딩. L2: /var/mesh/cache/cocoapods, /var/mesh/cache/gradle. 사용자 홈 글로벌 캐시 역쓰기 금지. L3: /var/mesh/artifacts/{job_id}. 업로드 성공 후 검증 사이드카만 유지. 모니터링은 layer_*_bytes를 계층별 보고하고 「/ 파티션 85%」만 의존하지 않습니다.

03

6단계 Runbook: 워터라인 스크립트에서 3계층 자동 회수까지

아래 6단계는 Runner가 Mac Mesh 라벨에 연결되고 Job 전 시트 acquire·후 release를 전제로 합니다.순서를 건너뛰지 마세요. 지표 없는 워터라인은 맹삭제입니다.

  1. 01

    3계층 사전·경로 고정:L1/L2/L3 루트, warn(82%)/hard(92%)를 mesh-disk-policy.yaml 에 기록하고,이미지 목록 에 기본 마운트를 등록합니다.

  2. 02

    disk-waterline 프로브 배치:60초마다 볼륨 사용률·계층 바이트를 수집해 Prometheus/OpenTelemetry로 전송. hard 도달 시 Runner를 drain 하고 신규 Job을 fail-fast 합니다.

  3. 03

    DerivedData 격리:CI에서 DERIVED_DATA_DIR 를 workspace 해시 버킷으로. 리스 종료 시 해당 버킷 LRU. 글로벌 DerivedData 일괄 스캔 금지.

  4. 04

    L2 의존 캐시 evict:CocoaPods는 pod cache clean을 「시간」이 아닌 「용량」 기준으로. Gradle은 GRADLE_USER_HOME 을 mesh 하위로 두고 max-cache-size를 제한합니다.

  5. 05

    산출물·rsync 훅: 오브젝트 스토리지 multipart 완료 콜백으로 로컬 L3 삭제. 실패 재시도 7일 보존. 필드는 산출물 Runbook 과 정합합니다.

  6. 06

    주간 점검·훈련:골든 이미지 checksum 대조, 90% 워터라인 Job 거부 시뮬레이션, 정리 감사 로그 기록.Burst 오버플로 연동 시 L3를 먼저 비운 뒤 중단 가능 Job을 수용합니다.

disk-waterline 프로브 최소 필드
hostname
pool_type
volume_mount
waterline_used_pct
waterline_warn_threshold
waterline_hard_threshold
layer_l1_deriveddata_bytes
layer_l2_cocoapods_bytes
layer_l2_gradle_bytes
layer_l3_artifacts_bytes
seat_lease_id
last_cleanup_ts_unix
cleanup_evicted_bytes_1h
disk_waterline_hard_stop

힌트:프로브 출력을 Grafana 패널 첫 행에 두고 OS 알림만 의존하지 마세요.cleanup_evicted_bytes_1h 과 성공 빌드 수를 같은 그래프에 두면 「실정리」와 「빌드 감소로 보이는 여유」를 구분할 수 있습니다.

04

증상 매트릭스: 디스크 알림에서 계층 vs 풀 무엇을 먼저 볼까

디스크 알림은 큐 SLO 와 증상이 겹치기 쉽습니다. 아래 표로용량, 캐시 키, 산출물 적체 중 무엇인지 특정한 뒤 정리 범위를 정하세요.

증상layer_* 우세추정 근인우선 조치
Xcode 단계만 실패L1 높음DerivedData 오염·인덱스 손상workspace 해시로 버킷 정리
Android/iOS 혼합 풀 지연L2 높음Pods/Gradle evict 없음L2 용량 상한 강화
업로드 성공 후에도 만충L3 높음rsync 훅 미연동오브젝트 스토리지 콜백 추가
df 정상이나 쓰기 실패스냅샷APFS 로컬 스냅샷스냅샷 보존 축소 + 프로브

주의:시트 락보유 중 볼륨 단위 rm -rf 는 실행하지 마세요. 정리 스크립트는 seat_lease_id 가 비었거나 리스 만료를 확인하고, 아니면 컴파일 중 ModuleCache를 삭제합니다.

L1 정리 후 24시간 내 다시 만충이면 디스크 추가보다 먼저 worktree 격리 부족으로 동일 노드에 풀 DerivedData가 병행되지 않는지 확인하세요.

05

3가지 하드 임계값과 인용 가능한 운영 파라미터

아래 수치는 16GB/24GB 공유 풀 다현장 절충입니다. 변경 티켓에 넣으면 대외 SLO 첨부로 씁니다.전용 풀은 warn을 5%p 낮춰 인덱스 핫 캐시 안정성과 교환할 수 있습니다.

  • 이중 워터라인:waterline_warn_threshold=82 로 L3→L2→L1 순 evict.waterline_hard_threshold=92 로 신규 Job 거부· disk_waterline_hard_stop=1
  • L1 최대 체류:공유 풀 workspace 버킷은 14일 또는 32GB 중 빠른 쪽 삭제.Dedicated는 28일까지 가능하나 전용 태그 필수.
  • L3 로컬 보존:rsync/업로드 성공 후 48시간 내 삭제. 실패 큐 7일. 초과 시 알림·오브젝트 스토리지 수동 확인.

512GB 시스템 볼륨에서 mesh에 약 60% 할당 현장은 L2 합계 80GB(CocoaPods/Gradle 각 40GB 소프트 상한), L3 단일 Job 12GB(dSYM 포함) 권장합니다.「주말 cron만」이나 「전원 ssh 수동 삭제」를 상시안으로 두면 감사 필드·시트 계약이 없어 이웃 오삭제, 콜드스타트 급증, 반쯤 쓰인 산출물이 릴리스 주에 집중됩니다. iOS/Android CI·디스크 SLO를 계약 가능한 클라우드 Mac Mini에 올릴 팀에는 VpsMesh Mac Mini 클라우드 대여가 보통 최적입니다. 요금제는 가격 페이지, 온보딩·워터라인 스크립트 예시는 고객 센터, 주문 페이지를 보세요.

FAQ

독자가 가장 많이 묻는 세 가지

기본은 workspace 해시 버킷과 시트 리스 바인딩이며, 리스 종료 시 해당 버킷 LRU입니다. 다중 브랜치는 worktree 격리 글을 참고하세요. 전역 ~/Library/Developer/Xcode/DerivedData 무제한 공유는 피하세요.

Runner는 fail-fast 후 disk_waterline_hard_stop을 보고해 반쓰기 산출물을 막습니다. 스케줄러는 여유 노드로 라우팅하거나 Burst를 트리거합니다. 시트 의미는 동시 시트 글을 참고하세요.

필요합니다. 디스크 정리는 런타임 쓰레기만 회수하며, 스냅샷 드리프트 목록을 대체하지 않습니다. 온보딩은 고객 센터, 요금제 비교는 가격 페이지를 보세요.