피드로 돌아가기
Node.js 22.1.0 (Current)
Node.js BlogNode.js Blog
Backend

Node.js 22.1.0이 NODE_COMPILE_CACHE 환경 변수로 온디스크 V8 코드 캐시를 도입해 모듈 재로드 시간을 130ms에서 80ms로 단축

Node.js 22.1.0 (Current)

2024년 5월 2일5intermediate

Context

Node.js는 CommonJS 및 ECMAScript Module을 매번 컴파일할 때마다 동일한 컴파일 작업을 반복하고 있었다. 특히 모듈 그래프가 변경되지 않은 상태에서 재로드되는 시나리오에서 불필요한 컴파일 오버헤드가 발생했다.

Technical Solution

  • NODE_COMPILE_CACHE 환경 변수로 V8 코드 캐시 디렉토리 경로 지정: 지정된 디렉토리에 컴파일된 바이너리 코드를 온디스크에 캐싱
  • CommonJS와 ECMAScript Module 모듈 컴파일 시 기존 캐시 재사용: 컴파일 단계를 스킵하고 디스크에서 캐시된 코드 역직렬화(deserialization)로 로드
  • 모듈 내용 변경 감지 메커니즘 구현: 모듈 내용이 변경되지 않으면 캐시 유효성 유지
  • 노드 버전별 독립적 캐시 관리: 서로 다른 버전의 Node.js가 동일 디렉토리 사용 시 버전별로 분리된 캐시 생성
  • 캐시 초기화 방식 단순화: 캐시 디렉토리 삭제로 정리 가능하며 재사용 시 자동 재생성

Impact

로컬 테스트 환경 기준 test/fixtures/snapshot/typescript.js 로드 시간 130ms에서 80ms로 약 38% 단축

Key Takeaway

모듈 시스템의 성능 최적화는 첫 로드의 약간의 오버헤드를 감수하고 재로드 시나리오에서의 반복적 비용을 제거하는 트레이드오프 전략이 효과적이다. V8 코드 캐시의 온디스크 수록으로 런타임의 핫패스 성능을 개선할 수 있다.


Node.js를 사용하는 개발 환경이나 프로덕션 서버에서 NODE_COMPILE_CACHE=/path/to/cache 를 설정하면 모듈이 자주 로드되는 워크로드(테스트 실행, 개발 서버 재시작, 함수형 컴퓨팅)에서 로드 레이턴시를 30% 이상 단축할 수 있다. 단, V8 JavaScript 코드 커버리지 측정이 필요한 경우 캐시 역직렬화 함수의 커버리지 정밀도 손실을 고려해 비활성화해야 한다.

원문 읽기