Nix 패키지 관리 시스템의 속도를 향상시키는 ncro 프록시 등장!
Nix의 서브스티튜터(substituter) 목록은 단순한 순차적 요청으로 인해 성능 저하(Performance Degradation)를 유발함
ncro는 Rust 기반의 HTTP 프록시로, 병렬 요청 및 캐싱을 통해 성능을 개선함
ncro는 NAR 캐싱(NAR Caching)을 지양하고, 라우팅 최적화에 집중하여 설계됨
커뮤니티에서는 ncro의 단순성(Simplicity)과 문제 해결 능력(Problem-Solving Ability)에 긍정적인 평가를 내림
Nix 서브스티튜터(Substituter)의 문제점
Nix의 서브스티튜터(Substituter)는 단순한 순차적 요청 방식으로 인해 여러 바이너리 캐시(Binary Cache)를 사용하는 환경에서 성능 저하를 유발한다. 특히, 각 캐시에 대한 HEAD 요청(HEAD Request)을 순차적으로 수행하며, 응답 시간이나 캐시의 상태를 고려하지 않아 지연 시간이 증가한다. 이러한 구조는 대규모 프로젝트나 여러 지리적 위치의 캐시를 사용하는 경우 빌드 속도(Build Speed)에 병목 현상을 초래한다.
ncro: Nix 캐시 라우팅 최적화 도구
ncro는 Nix의 서브스티튜터(Substituter) 문제를 해결하기 위해 개발된 HTTP 프록시로, Rust 언어로 구현되었다. ncro는 병렬 HEAD 요청(Parallel HEAD Request)을 통해 가장 빠른 캐시를 선택하고, NAR 데이터를 스트리밍 방식으로 전송하여 디스크 I/O를 최소화한다. 또한, SQLite 기반의 캐싱(Caching)을 통해 라우팅 결정을 저장하여 재시작 시에도 성능을 유지한다.
ncro의 아키텍처 및 설계 특징
ncro는 NAR 데이터를 캐싱하지 않고, 라우팅 최적화에 집중하는 설계를 채택했다. 이는 디스크 공간 관리 및 캐시 무효화(Cache Invalidation) 문제를 회피하기 위함이다. ncro는 우선순위 기반의 라우팅(Priority-Based Routing), 실패 감지(Failure Detection), 동시성 제어(Concurrency Control) 등 다양한 기능을 제공하여, Nix의 서브스티튜터(Substituter) 성능을 향상시킨다. 특히, 데이터 미저장 정책(Zero-Retention Policy)을 통해 보안성을 강화했다.
ncro의 기술적 구현 상세
ncro는 FuturesUnordered를 사용하여 병렬 HEAD 요청을 처리하고, Moka Cache를 통해 캐싱 성능을 향상시킨다. 또한, ed25519를 이용한 서명 검증(Signature Verification)을 통해 보안을 강화한다. ncro는 네트워크 지연 시간(Network Latency)을 고려하여, EMA(Exponential Moving Average) 기반의 헬스 체크(Health Check)를 수행하고, 업스트림(Upstream)의 상태를 동적으로 관리한다.