
사전예약 서버 프로파일링으로 서버 병목찾아 개선하기
두줄요약
Artillery와 Linux perf Flamegraph로 Node.js 이미지 생성 서버의 병목을 분석했습니다.\n불필요한 이미지 리사이징을 제거해 처리량을 10 RPS에서 70 RPS로 개선했습니다.
문제 상황
- 요청 시점마다 node-canvas로 시민권 이미지 생성·S3 업로드가 필요한 고비용 서비스
- 2코어·512MB 노드 9대 환경에서 10 RPS 수준, 요청당 1,400~1,600ms 소요
원인 분석
- Node.js Inspector 프로파일에서 이미지 로드·합성 구간의 높은 실행 시간 확인
- Docker 컨테이너에서 Linux perf와 Flamegraph로
bits_image_fetch_convolution_affine_reflect_a8r8g8b8함수 비중 약 30% 확인 - 고해상도 원본 이미지를 여러 차례 축소하는
drawImage리사이징 연산의 픽셀 순회 비용
해결 방법
- 원본 소스 이미지를 시민권 출력 크기에 맞춰 사전 리사이징
drawImage호출 시 불필요한dWidth,dHeight제거로 런타임 리사이징 축소- Artillery 부하 테스트와 Node.js Profiler·perf Flamegraph를 결합한 개선 효과 검증
성능/운영 포인트
- 70 RPS까지 처리량 향상, 기존 대비 약 7배 부하 수용
- 요청 처리 시간 700~800ms로 감소
- perf의 JavaScript 심볼 매핑을 위한
--perf-basic-prof옵션과 컨테이너의--privileged설정
