본문 바로가기
Research/Node.js

Node.js API 서버 성능 개선기 요약

by RIEM 2023. 2. 6.

https://www.youtube.com/watch?v=3AMqUmrNido

우리 프로젝트에서 참고할 만한 내용

성능 개선을 위해 생각해 볼 요소(인프라)

  • 클러스터를 싼 것을 사용(T2.micro) -> 인스턴스 큰 것으로 변경하기
  • 도커 CPU, memory 사이즈 조정하기
  • DB pool 사이즈 조정하기

성능 개선을 위해 생각해 볼 요소(어플리케이션)

  • node.js 버전
  • v8 엔진 버전, 컴파일러(5.9 이전에는 Crankshaft, 5.9이후로는 Ignition + Turbofan)
  • 관련 npm 패키지 버전
  • DB 버전
  • 언어(JS or TS)

시나리오 기반으로 생각해볼 것

  • Series N 단계 투자를 받은 유저 수 x명을 보유한 서비스 소유한 스타트업의 유저 수가 y명으로 급격히 증가할 경우를 대비한 시나리오
  • 어느정도 자리를 잡은 중견 이커머스 스타트업에서 특정 기념일에 약 n만명의 유저의 트래픽이 급격히 발생할 경우를 대비한 시나리오

서버 테스트 시 측정할 요소

  • web stransaction time
  • Throughput(rpm)

영상 요약

성능 테스트를 위한 준비

발표자가 만든 서버

  • 인증 API 서버(회원가입, 로그인, 권한 부여, 회원 정보 관리). 기본 CRUD 구현

알고자 했던 것

  • 서버 한계 파악 : 내가 짠 서버가 과연 어디까지 버틸까?
  • 병목 구간 확인 : 코드의 어느 부분에서 트래픽이 발생할까?
  • 코드 개선 후 확인 : callback -> promise, async/await 등으로 바꿨을 때 얼마나 차이가 있을까?

목적

  • Unit test 외 실제 트래픽과 유사한 상황에서의 성능을 파악하기 위해

성능 테스트의 도구

테스트 도구 선정

성능 테스트 도구 선정 기준

  • 사용자 시나리오 기반으로 작성할 수 있을 것. 예) 유저가 어떤 상황에서 로그인을 하나?
  • 대량 트래픽 조절 가능할 것
  • 성능 테스트 도구도 Node.js로 할 것. npm으로 다 커버 가능할 것

고려한 테스트 도구 후보

  • Jmeter : 성능 뛰어나다고 알려져있으나 친숙하지 않아서 제외
  • Artillery : 인지도 높고 다양한 기능 지원(이걸 선택)

Artillery

duration : 240, arrivalCount : 24 
  • 240초 동안 24 유저(시나리오) 생성 -> 10초에 한명씩 새 유저 생성
  • -> 4분동안 10초에 한 유저씩 생성되는 상황 구현

  • capture : 받은 토큰을 받아서 다시 보내기 위함
    (그 외 세부 Artillery 코드는 영상 또는 블로그 참조)

APM?

Artillery로 성능 테스트 환경 마련 이후 APM이란 것도 활용 가능

  • APM(Application Performance Management)의 필요성 생김(왜?)

Node.js 대표 APM

  • NewRelic(발표자가 선택한 것)
  • RisingStack
  • NSolid
  • pinpoint

APM으로 NewRelic 선정 이유

  • Production 전 단계에서 고가의 APM 사용하기 부담스러움. NewRelic은 24시간 Free trier무료 기능이 있음(재확인 필요)

테스트 서버 아키텍처

타겟 서버

  • 서버를 모두 도커로 띄우고 있는 상황
  • ECS cluster (aws의 도커를 띄어주는 오케스트레이션 서비스)로 도커 관리하고 있음
  • 도커들의 DB로 RDS를 사용중

테스트 서버(Vagrant, Ansible은 러닝커브 높아서 지식 없는 경우 며칠 내에 구현은 어려움)

  • Vagrant : 버추얼 박스에서 개발 환경 띄울 때 주로 사용. AWS에서 띄울 수 있음. 동시에 여러대 띄우기 위함.
  • Ansible

테스트 후 성능 분석

댓글