Node.js 이벤트 루프 마스터링: 더 높은 RPS로의 확장 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Node.js 서버 성능 최적화에 관심 있는 개발자(중급~고급)
핵심 요약
- 동기 I/O 방지:
fs.readFileSync
대신fs.promises.readFile
사용하여 이벤트 루프 차단 방지 - 비동기 작업 배치:
p-limit
를 활용해Promise.all
병렬 처리 제어 (100개 동시 실행 제한
) - CPU 집약 작업 이전:
Worker Threads
로 PDF 생성 작업 분리 (generatePDFReport()
이벤트 루프 차단 방지)
섹션별 세부 요약
1. 이벤트 루프 병목 현상
- 10,000 RPS 시 응답 시간 20ms → 1초 이상 증가
- CPU 사용량은 낮으나 이벤트 루프 차단으로 인한 성능 저하
- 주요 원인: 동기 I/O, CPU 집약 작업, 미컨트롤된 마이크로태스크
2. 동기 I/O 최적화
- 기존 동기 설정:
JSON.parse(fs.readFileSync('config.json'))
(이벤트 루프 차단) - 해결책:
fs.promises.readFile('config.json', 'utf-8')
비동기 I/O 사용- 결과 캐싱으로 반복 I/O 방지
- 성과: 이벤트 루프 지연 35% 감소
3. 비동기 작업 제어
- 문제: 10,000개 이메일 동시 발송으로 이벤트 루프 지연 200ms 발생
- 해결책:
p-limit(100)
으로 동시 처리 수 제한batch(() => sendEmail(user))
로 작업 분할- 성과: 이벤트 루프 지연 200ms → 10ms 이하 감소
4. CPU 집약 작업 이전
- 문제: PDF 생성 작업
generatePDFReport()
로 2초 동안 이벤트 루프 차단 - 해결책:
Worker Threads
로 작업 분리 (new Worker('./pdf-worker.js')
)- 메시지 통신으로 결과 전달 (
worker.postMessage()
,worker.on('message')
) - 성과: PDF 생성 중 이벤트 루프 차단 없음
결론
- 핵심 팁:
sync
연산은 이벤트 루프에 치명적 →async/await
활용Promise.all
병렬 처리 시p-limit
로 제한 적용- CPU 집약 작업은
Worker Threads
로 이전 - 실적: 최종적으로 50,000 RPS 처리, 50ms 이하 지연 유지 가능