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

Node.js 20.8.0이 writable/readable streams 최적화로 생성·소멸 시간 15% 단축 및 readable webstream async iterator 성능 140% 향상

Node.js 20.8.0 (Current)

2023년 9월 29일5intermediate

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 마이그레이션으로 해결할 수 있다.

원문 읽기