들어가기
최근 실험들을 토대로 분석한 결과 VUsers 141명을 기점으로 TPS가 더 이상 늘어나지 않는 점을 파악했고, 이 지점을 임계점 또는 포화점(Saturation Point)로 정리했다.
그럼 그 다음 스텝은 무엇인가? 바로 성능을 개선하는 것이다. 사실 성는을 개선하는 방법은 많다. 선택권이 많기에 오늘 내가 생각할 부분은 우리에게 어떤 선택권들이 있고 그중 어떤 선택권이 최적의 선택인지에 대해 결정하는 일이다.
Node.js 성능에 대한 글을 봤는데, 거기에 수평적 확장과 수직적 확장에 대한 내용이 나와 참고하기로 했다. (참고 글 : https://medium.com/iquii/good-practices-for-high-performance-and-scalable-node-js-applications-part-1-3-bb06b6204197)
Node.js의 성능을 향상시킬 수 있는 방법들
이 포스트에 따르면 어플리케이션의 Throughput(시간당 처리량)을 늘리는 방법은 어플리케이션을 Scale하는 것이다. Scale(확장)은 1)수평적 확장과 2)수직적 확장 이 두 유형으로 구분할 수 있다.
2)수직적 확장의 경우 단일 머신의 성능을 올리는 것을 말한다. EC2를 쓴다면 높은 성능의 옵션을 선택하면 된다. 우리가 집중할 부분은 1)수평적 확장이다. 수평적 확장은 트래픽을 처리할 때 어플리케이션의 인스턴스를 복제하여 대응하는 방식이다. 여기서 머신을 1개로 하냐 2개로 하냐에 따라 더 상세하게 들어갈 수 있다.
도표는 포스트에 나오는 도표들을 하나로 종합한 것이다.
단일 머신으로 수평적 확장
Node.js의 수평적 확장은 머신이 1개냐 2개 이상이냐에 따라 달라진다.
단일 머신일 경우, 여러 코어에 프로세스를 만드는 방식으로 확장을 한다. 그렇다고 해서 프로세스를 무한 복제한다고 처리량이 늘어나진 않는다.
포스팅에서 제시하는 수평적 확장의 예시는 아래와 같다.
- Node.js cluster 모듈 사용하기 : 많이 사용하는 방식이나 수동으로 프로세스 관리를 해야한다는 단점이 있다
- PM2 cluster mode 사용하기 : PM2는 클러스터 모드를 통해 수평적 확장을 손쉽게 하도록 도와주는데, 작성자는 이 방식을 추천했다
이 외에도 Node.js 워커 스레드 방식도 있다. 주변 개발자분의 의견에 따르면 Node.js 클러스터 모드는 작은 일을 많이 처리할 때 주로 사용하고, 워커 스레드는 큰 단위의 일을 처리할 때 사용한다고 했다. 경험으로 이야기해주신 부분이여서 이론과 어떤 차이가 있을 지는 한번 더블체크 해볼 필요가 있다.
그 외에도 한 Udemy node.js 강의에서는 Worker thread 왠만하면 쓰지말라고 이야기했다. 납득이 갈만한 이유를 제시하진 않았는데, 뭔가 워커 스레드는 잘 안쓰는 인상을 받았다.
현재 나의 마음은 PM2 클러스터 모드로 가는 쪽으로 기울었다. PM2가 더 간편한데 굳이 Node.js 클러스터 모듈 수동 구현을 고집할 필요는 없다. 게다가 이전에 이미 직접 구현해본 경험이 있어서 큰 미련도 없다.
그런데 문제는 현재 어플리케이션이 t2.micro를 사용하고 있기 때문에 스케일업을 우선 해야할 것이다.
복수 머신으로 수평적 확장
머신이 2개 이상이라면 로드 밸런서도 함께 쓰인다. 로드 밸런서는 AWS ELB, NGINX 등 여러 선택지가 있는데, AWS 인프라를 사용하고 있고 또 수동으로 NGINX를 구축하고 싶지 않다면 ELB로 가는 것이 좋다. 게다가 ELB는 간편할 뿐만 아니라 오토스케일링과 같은 기능도 제공한다.
로드 밸런서를 2개 이상 쓰는 경우도 있다. 이때 밸런서들은 각자 ip 주소를 가지고 이들을 다시 DNS Resolver로 묶어주는 형태다.
로드밸런서를 2개 이상 쓰는 방식은 우리의 어플리케이션 아키텍처에 있어서 오버스펙이기 때문에 단일 로드밸런서를 사용하는 것이 적절하다고 판단된다.
마치며
우리 프로젝트에서 Node.js 어플리케이션의 성능을 향상하기 위해 어떤 옵션들이 있는지 살펴보았다. 그중 앞으로 수행할 것들을 정리해보았다.
- WAS 스케일업을 통해 멀티 코어 확보 후 전후 성능 비교 실험
- PM2 프로세스 매니저 학습
- WAS PM2 클러스터 모드 적용 후 전후 성능 비교 실험
- 로드밸런서 적용 후 성능 비교 실험
기타
- 클러스터 모드 적용 시 redis 활용 문제 확인
- 도커 적용
'Research > Node.js' 카테고리의 다른 글
Express.js_typescript로 시작하는 방법 (0) | 2023.03.23 |
---|---|
npm_Package.json 파일 해석 (0) | 2023.03.23 |
nodejs_번역_고성능 및 확장 가능한 Node.js 어플리케이션에 대해 - 3 (0) | 2023.03.01 |
nodejs_번역_고성능 및 확장 가능한 Node.js 어플리케이션에 대해 - 2 (0) | 2023.02.28 |
nodejs_번역_고성능 및 확장 가능한 Node.js 어플리케이션에 대해 - 1 (0) | 2023.02.28 |
댓글