피드로 돌아가기
Node.js BlogBackend
원문 읽기
Node.js 20.8.0이 writable/readable streams 최적화로 생성·소멸 시간 15% 단축 및 readable webstream async iterator 성능 140% 향상
Node.js 20.8.0 (Current)
AI 요약
Context
Node.js의 stream API와 webstream 구현에서 메모리 오버헤드와 비효율적인 async iterator 처리로 인해 대규모 데이터 처리 시 성능 저하가 발생했다. vm.Script, vm.compileFunction, vm.SyntheticModule, vm.SourceTextModule 등 동적 모듈 import를 지원하는 API에서 메모리 누수와 use-after-free 문제가 오래 동안 해결되지 않았다.
Technical Solution
- Writable/Readable streams의 생성 및 소멸 로직 재구현: Benjamin Gruenbaum(#49745)과 Raz Luvaton(#49834)이 메모리 할당 및 정리 과정 최적화
- Readable webstream의 async iterator 처리 개선: Raz Luvaton이 async iterator 소비 경로 재설계(#49662, #49690)
- Readable webstream의 pipeTo 메서드 최적화: 파이프라인 연결 성능 향상
- VM 모듈의 importModuleDynamically 지원 API 메모리 누수 제거: Joyee Cheung이 vm.Script, vm.compileFunction, vm.SyntheticModule, vm.SourceTextModule의 메모리 관리 재작성(#48510)
- 메모리 누수 및 use-after-free 버그 수정: VM 컨텍스트 정리 단계에서의 리소스 해제 로직 개선
Impact
- Writable/Readable streams 생성 및 소멸 성능: ±15% 개선
- 각 stream의 메모리 오버헤드: 감소
- Readable webstream async iterator 소비 성능: ±140% 향상
- Readable webstream pipeTo 소비 성능: ±60% 향상
Key Takeaway
Stream 및 VM 모듈 같은 저수준 API의 메모리 관리 최적화는 상층부 애플리케이션의 대규모 데이터 처리 성능에 직접적인 영향을 미치며, 오래된 메모리 누수 버그 제거는 버전 마이그레이션 장벽을 낮춘다.
실천 포인트
Node.js 스트림 기반 데이터 처리를 하는 서비스에서
2
0.
8.0 이상으로 업그레이드하면 메모리 사용량 감소와 처리량 증가를 동시에 얻을 수 있으며, importModuleDynamically를 사용하는 구형 Node.js 환경의 메모리 누수 문제를
2
0.
8.0 마이그레이션으로 해결할 수 있다.