sccache - 공유 컴파일 캐시 치트시트
sccache는 Mozilla의 (ccache 정신에서) 컴파일러 캐시로 Rust, C/C++, NVCC를 지원합니다. 컴파일러를 래핑하고, 입력을 해싱하고, 동일한 컴파일을 본 적이 있을 때 캐시된 객체를 반환합니다. 그 특징 기능은 공유 저장소 백엔드입니다 — S3, GCS, Redis, Azure — 따라서 전체 팀과 CI 플릿이 하나의 캐시를 공유합니다. 이는 “CI는 모든 스크래치에서 재컴파일”을 “CI는 이미 구축한 것을 다운로드”로 전환합니다.
설치
| 방법 | 명령 |
|---|
| Cargo | cargo install sccache --locked |
| macOS (Homebrew) | brew install sccache |
| 바이너리 | GitHub Releases에서 다운로드 |
| 확인 | sccache --version |
Rust로 사용
# 일회성
RUSTC_WRAPPER=sccache cargo build
# 지속가능 (~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
| 변수 | 목적 |
|---|
RUSTC_WRAPPER=sccache | sccache를 통해 rustc 라우팅 |
SCCACHE_DIR | 로컬 캐시 디렉토리 |
SCCACHE_CACHE_SIZE | 최대 로컬 캐시 크기 (예: 20G) |
C/C++로 사용
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
# Make
make CC="sccache gcc" CXX="sccache g++"
효과성 확인
| 명령 | 표시 |
|---|
sccache --show-stats | 히트, 미스, 캐시 크기, 오류 |
sccache --zero-stats | 테스트 빌드 전 카운터 리셋 |
sccache --stop-server | 백그라운드 서버 중지 |
sccache --start-server | 명시적으로 시작 |
# 콜드 vs 따뜻한 빌드 측정
sccache --zero-stats
cargo build --release
sccache --show-stats # misses 예상
cargo clean && cargo build --release
sccache --show-stats # hits 예상
핵심 숫자는 캐시 히트율입니다. 낮은 속도는 보통 입력에서 뭔가 변경되고 있음을 의미합니다 (플래그, 환경 변수, 절대 경로).
공유 클라우드 백엔드
# S3
export SCCACHE_BUCKET=my-build-cache
export SCCACHE_REGION=us-east-1
export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
# Redis
export SCCACHE_REDIS=redis://cache.internal:6379
# GCS
export SCCACHE_GCS_BUCKET=my-build-cache
export SCCACHE_GCS_KEY_PATH=/path/to/key.json
| 백엔드 | 환경 접두사 |
|---|
| 로컬 디스크 | SCCACHE_DIR |
| S3 / S3 호환 | SCCACHE_BUCKET, SCCACHE_ENDPOINT |
| Redis | SCCACHE_REDIS |
| GCS | SCCACHE_GCS_* |
| Azure | SCCACHE_AZURE_* |
| GitHub Actions | SCCACHE_GHA_ENABLED=true |
CI 패턴
# GitHub Actions
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: mozilla-actions/sccache-action@v0.0.5
- run: cargo build --release
- run: sccache --show-stats
캐싱을 깨뜨리는 것
| 원인 | 수정 |
|---|
| 출력의 절대 경로 | --remap-path-prefix 사용 |
변경 RUSTFLAGS | 실행 간 플래그 안정 유지 |
| 증분 컴파일 | 캐시 사용을 위해 비활성화 (CARGO_INCREMENTAL=0) |
| Proc 매크로 / 빌드 스크립트 | 항상 캐시 가능하지는 않음 |
| 다른 컴파일러 버전 | 캐시 키에 컴파일러 포함 |
sccache vs 대안
| 측면 | sccache | ccache | Bazel/Buck |
|---|
| 언어 | Rust, C/C++, CUDA | C/C++ | 많음 (전체 빌드 시스템) |
| 공유 캐시 | 클라우드 백엔드 기본 제공 | 주로 로컬 | 원격 캐시/실행 |
| 설치 | 래퍼 환경 변수 | 래퍼 | 새로운 빌드 시스템 채택 |
| 최고의 용도 | 기존 빌드 속도 향상 | C/C++ 로컬 캐싱 | 대형 모노레포 |
mold와 잘 어울립니다 — sccache는 컴파일 시간을 줄이고, mold는 링크 시간을 줄입니다.
리소스