2026 원격 Mac 프론트 의사결정 매트릭스:
Sharp·libvips·ImageMagick — 정적 빌드 동시성·메모리 피크·CI 캐시
대상: 원격 Mac에서 SSG·프리렌더로 대량 파생 이미지를 만드는 프론트·풀스택 팀. 동시 디코드 겹침·느린 TMPDIR이 OOM·지연을 만듭니다. Sharp·libvips·ImageMagick 매트릭스와 스크립트 예시를 정리했습니다. Tailwind·PostCSS 메모리표, Vite·Webpack 캐시, package.json 프리플라이트와 병행하세요.
01 시나리오: SSG에서 썸네일·반응형 파생 대량 생성
소스당 다중 파생을 npm run build에 넣으면 원격 러너는 CPU보다 RSS 겹침·느린 TMPDIR·스레드 과다로 먼저 무너집니다.
저장소당 주력 툴 하나. Sharp와 magick을 한 잡에 섞지 마세요. 공유 노드는 물리 코어에서 여유 한 칸을 남기고 스레드를 맞춥니다.
- for 루프 무한 병렬 금지—p-limit·worker_threads로 상한.
- temp는 로컬 SSD
.cache/img-tmp. - 캐시 키는 브랜치가 아니라 체크섬.
02 세 가지 스택 파라미터 표: Sharp·libvips·ImageMagick
.env.ci에 넣는 손잡이입니다. Sharp는 번들 libvips와 공유하므로 VIPS_CONCURRENCY를 한 기준으로 맞춥니다. 프리플라이트 단계에서 스크립트가 이 값을 echo하면 리뷰어가 러너 설정을 빠르게 대조합니다.
| 항목 | Sharp(Node+libvips) | libvips(CLI·직접) | ImageMagick 7 |
|---|---|---|---|
| 적용 포맷 | JPEG·PNG·WebP·AVIF·TIFF, Node 일원화. | 동일 코덱, 대형 TIFF·피라미드. | 델리게이트 넓음, 오버헤드 큼. |
| 동시성 env | VIPS_CONCURRENCY·UV_THREADPOOL_SIZE·JS 큐. |
VIPS_CONCURRENCY≤P코어. |
MAGICK_THREAD_LIMIT·OMP_NUM_THREADS. |
| 임시 디렉터리 | TMPDIR SSD, NFS 홈 금지. |
동일, iostat 확인. | MAGICK_TEMPORARY_PATH+TMPDIR. |
| OOM 신호 | 대해상도 디코드 급등, 네이티브+힙 합산. | 스캔라인, 스레드 먼저 감소. | 필터 중간복제, -limit memory|map. |
| CI 캐시 | node_modules+주소캐시, Sharp·libvips 버전 키. | 산출물, vips --vips-version. |
magick -version·policy 해시. |
{
"scripts": {
"img:ssg": "NODE_OPTIONS='--max-old-space-size=6144' node ./scripts/generate-thumbnails.mjs",
"img:ssg:safe": "VIPS_CONCURRENCY=4 MAGICK_THREAD_LIMIT=4 TMPDIR=$PWD/.cache/img-tmp pnpm run img:ssg"
}
}
16GB: NODE_OPTIONS=--max-old-space-size=6144, VIPS_CONCURRENCY=4, mkdir -p .cache/img-tmp.
- 기본 힙 2~4GB 전후.
- VIPS_CONCURRENCY≈P코어 절반.
- ImageMagick 디버그 시 MAGICK_THREAD_LIMIT=1.
03 원격 Mac 검수 3단계와 다섯 가지 사전 점검
스테이징·프로덕션 동일 SKU로 스왑 없이 SLO 검증.
- 천 장 샘플로 시간·RSS·temp 쓰기 기록.
- Sharp·vips·magick 버전을 캐시 키·README에 고정.
- 프로덕션 env만으로
NODE_OPTIONS·TMPDIR·스레드 재실행.
SSD 20% 여유, dist 삭제 실수 차단, Sharp 중복 설치·AVIF 타깃·번들러 피크와 겹침 방지.
04 FAQ
Sharp만 쓰면 libvips 튜닝이 필요 없나요?
아니요. VIPS_CONCURRENCY와 JS 큐를 동시에 풀로 올리면 RSS만 커집니다.
웹 코덱 위주면 기본은?
libvips·Sharp가 동시성만 잡으면 이득이 큼. 특수 델리게이트 없으면 ImageMagick은 보조.
스왑 증가 시?
먼저 병렬·스레드 감소, 그다음 --max-old-space-size.