2026 Mac Mini 대여 7×24: HandBrake CLI vs FFmpeg VideoToolbox — 병렬 트랜스코드 의사결정 매트릭스, 열 스로틀 임계, 디스크 워터마크
장기 대여 Mac Mini에서 7×24·야간 배치 트랜스코드가 깨질 때 흔한 원인은 NVMe 병렬 과다·열 스로틀에 가려진 벽시간 증가·디스크 워터마크 초과 후에도 큐가 받는 것입니다. HandBrakeCLI와 FFmpeg VideoToolbox 비교, 매트릭스·병렬 표·체크리스트, GNU parallel·백오프·caffeinate·pmset을 묶습니다. 심화: 야간 ffmpeg·전원·워터라인·SSH·VNC.
하드웨어 전제
전용 계약이라도 전력·대역·재부팅은 공유됩니다. 장기 배치는 피크가 아니라 매일 도는 보수 레인으로 크기를 잡고, SSH·tmux로 드레인·재기동을 런북화합니다.
- SSD·경로: APFS 스크래치 우선; 읽기/쓰기 분리 시 썬더볼트. USB 허브 외장은 병렬에 불리.
- 코어·열: VT도 디먹스·필터·오디오가 CPU를 씁니다. 기준 클립 벽시간·팬을 주간 재측정.
도구 비교
HandBrakeCLI는 프리셋·QC 고정에, FFmpeg는 필터·세그먼트·패키징에 강합니다. 둘 다 VideoToolbox를 쓰며 차이는 운영 방식입니다.
| 레인 | 이렇게 고를 때 | 리스크 |
|---|---|---|
| HandBrakeCLI + VT 프리셋 | 라이브러리 규모 재인코딩, 동결 프리셋, 작업당 플래그 수를 줄이고 싶을 때 | HandBrake 버전별 프리셋 드리프트—컨테이너·바이너리 핀을 런북에 명시 |
FFmpeg + h264_videotoolbox / hevc_videotoolbox |
스케일·오디오 매핑·세그먼트 재시도·패키징이 필요할 때 | 플래그 폭주—검토된 템플릿만 프로덕션 레인에 허용 |
| 하이브리드 | 본 영상은 HandBrake, 먹싱·후처리는 FFmpeg | 임시 파일 이중—TMPDIR와 FFMPEG_TMPDIR를 같은 빠른 스크래치로 맞춤 |
예시 원라이너(프리셋·비트레이트는 환경에 맞게 조정)
# 인코더 목록: HandBrakeCLI --encoder-list
HandBrakeCLI -i "in.mov" -o "out.mkv" --preset "Fast 1080p30" -e vt_h264 -B 160
ffmpeg -hide_banner -nostdin -y -hwaccel videotoolbox -i "in.mov" \
-c:v hevc_videotoolbox -b:v 12M -tag:v hvc1 -c:a copy "out.mov"
병렬 임계 표
병렬 세션은 공통 예산입니다. 골든 클립 벽시간이 평탄할 때만 동시성을 올립니다.
| 호스트 프로필 | 기본 VT 동시 인코딩 | 황색 열 게이트 | 적색(큐잉 중단) |
|---|---|---|---|
| M4급, 단일 내부 NVMe | 1개 활성 VT; 읽기·쓰기를 디바이스로 분리했을 때만 2 검토 | 기준 클립 벽시간이 연속 두 번 기준의 110% 초과 | 125% 초과 또는 패키지 전력·팬 정책이 지속 이상 |
| M2 Pro / M3 Pro, 단일 스크래치 | 가벼운 필터 기준 1–2; 오디오 리먹스·강한 스케일 병행 시 1 | 구동 중앙값 대비 임의 작업 15% 이상 벽시간 악화 | 커널 thermal 로그 또는 관리 SSH 세션의 체감 끊김 |
| M1 / M2 베이스, 공유 레인 | 1 VT; CPU 필터 배치는 뮤텍스가 있는 별도 큐 | NVMe 이용률 고정·지연 이상치 | 디스크 워터마크 위반(다음 절) |
수동 병렬도와 큐 백오프
감독 스크립트가 큐를 소유하고, GNU parallel로 표의 --jobs와 APFS 완충용 --delay를 맞춥니다.
export TMPDIR="$HOME/Library/Caches/transcode-scratch"
export FFMPEG_TMPDIR="$TMPDIR"
parallel --jobs 1 --delay 8 --retries 3 --joblog vt.log --resume-failed \
./encode-one.sh ::: ./queue/*.mov
실패 후 지수 백오프+지터 예시입니다.
base=60; cap=600; attempt=1; max_attempt=5; delay=$base
until ./encode-one.sh; do
jitter=$(( delay / 4 ))
sleep $(( delay + RANDOM % (jitter + 1) ))
delay=$(( delay * 2 ))
[ "$delay" -gt "$cap" ] && delay=$cap
attempt=$(( attempt + 1 ))
[ "$attempt" -gt "$max_attempt" ] && exit 1
done
caffeinate와 pmset 주의
caffeinate -dimsu -- ./batch-driver.sh: 신뢰할 수 있는 셸에서 드라이버 전체를 감쌀 때.caffeinate -dimsu -w <worker-pid>: 부모 PID 수명에 어서션을 묶을 때.
pmset은 제공자 승인 후에만; pmset -g custom·assertions 스냅샷을 남기고 이상 시 롤백. 기준은 전원 매트릭스.
디스크와 로그
임시·스테이징이 최종보다 큽니다. APFS 게이트와 로그 로테이션을 함께 두세요.
파라미터 체크리스트
- 스크래치:
TMPDIR·FFMPEG_TMPDIR를 최고속 볼륨에 고정. - 황/적 디스크: 신규 일시정지 <20% 또는 <80GB; 하드스톱 <15% 또는 <50GB 후 드레인·부분물 검증.
- 아이노드·로그:
df -ih동시 탐침; 로그는 요약 위주·launchd ThrottleInterval ≥120s.
게이트는 코드 if로 두 경로(HandBrake·FFmpeg)에 동일 적용.
FAQ
- 한 큐에 HandBrakeCLI와 FFmpeg VideoToolbox를 섞어도 되나요?
- 단일 감독·동일 디스크 게이트·VT 세션 총량 캡이면 됩니다.
- VideoToolbox이면 CPU 튜닝이 필요 없나요?
- 아님. 종단 벽시계를 봅니다.
- 렌탈 맥에서 pmset을 바꿔도 되나요?
- 승인 시만; 일상은
caffeinate우선, 이상 시 원복. - 스토리지 순간 오류 후 어떤 백오프가 안전한가요?
- 60초→2배·상한600초·지터~30%·3~5회 후 에스컬레이션.