Node.js에서 서버 최적화를 진행하는 방법

2 분 소요

서버 최적화

  • 몇일전에 면접에서 대답을 하기 어려웠던 문제중 하나이다. 면접관님은 다음과 같이 질문 하셨었다.

데이터 베이스 쿼리 최적화를 더이상 진행할수 없는 상태에서 EC2 인스턴스가 자꾸 요청을 처리하다 다운이 되는 상태라면, 어떻게 핸들링 할것인가요?

아쉽게도 서버 확장이라는 답변만 생각났었다.

하지만 오늘 잠깐 조사한 것을 공유 하고자 한다.

이런경우 서버에서 요청에 대하여 어떤 작업을 실행하다 그 수행 시간이 매우 길어진 상태인듯 하니 서버에서 다른 최적화 작업이 필요하다.

그때 당시의 면접관님의 질문에서 명확하게 알려주지 않는 부분이 존재하여 다음과 같은 가정을 한다.

  1. 서버는 Express.js를 사용한다. 기타 미들웨어도 사용한다. 시퀄라이즈 ORM을 이용해서 RDS와 연결되어 있다.
  2. pm2을 사용하여 로그 정보를 어딘가에 저장하고 있다.

이런 저런 사이트를 돌아다니며 수집한 정보를 정리하자면 다음과 같다.

  1. HTTP/2 프로토콜 사용하기
    • HTTP/2 프로토콜은 버전 1보다 헤더를 압축하며, 한번에 여러 요청을 동시에 전달이 가능한 멀티플렉싱(응답 다중화)이 가능한 프로토콜이기 때문에, 기존 프로토콜보다 빠르다고 한다. 방분했던 블로그중 하나는 HTTP 핸드쉐이크 등 연결 절차가 종종 데이터를 전송하는것보다 더 오버헤드가 크기때문에, 이런 핸드쉐이크를 줄이는것이 중요하다고 주장하고 있다.

HTTP/2 프로토콜은 데이터 통신을 할때 이런 핸드쉐이크 과정을 다시 진행하지 않는다. 이전 연결을 다시 사용한다. 그런 장점은 특히 HTTPS 프로토콜에서 엄청난 연산을 필요로 하는 TSL 핸드쉐이크 과정이 적다는 것을 의미한다. 즉 서버의 부하를 줄이는 한가지 방법이 될 수 있다.

  1. 로그 파일 분석 로그 파일을 보면 어느 부분에서 오류가 등장하고, 어느 부분이 요청되는지 확인이 가능하다.(물론 익스프레스 미들웨어올 콘솔에 출력하게 하거나 해야 한다.) 또한 AWS cloudwatch, Kabana등 다른 로깅 서비스와 연동이 되어 있다면 시각화 자료를 찾기 쉬울것이다.

이런 데이터를 기반으로 어떤 요청이 들어오고, 어떤 부분에서 에러가 나오는지 등등을 확인해 봐야 한다. 분당 평균 응답률,평균 에러율등등을 살펴보면 어떤 부분에 문제가 존재하는지 확인할수 있다.

  1. 헤비한 작업, 리소스는 다른 서비스 / 서버로 이관

어느 블로그에서 나온 말을 보고 느낀점이긴 하지만 서버는 모든것을 처리하지 않을수록 좋아보인다. 서버가 TLS 핸드쉐이크 등등을 진행한다면 그만큼 시간이 더욱 오래 걸리는 점을 생각해 보면 좋을듯 하다.

서버는 RDS 에서 데이터를 가져오거나 좀더 복잡한 작업에 집중하고 비교적 간단한 작업들을 처리하지 않는편이 좋다.

차라리 로드 밸런서 등에서 TLS 등등의 오버헤드가 큰 작업을 하게 두자.

또한 정적 이미지의 경우는 익스프레서 서버 자체에서 제공하기보다는 S3 같은 곳 다른 서버에 저장한다음 링크를 전달하게끔 하는편이 좋다.

  1. 부하 테스트 갑자기 부하 테스트라는 이야기가 왜 등장하는건지 의문일수도 있다. 하지만 이미 2번 로그 파일 분석에서 힌트가 등장했었다.

어떤 부분이 요청이 많고, 어디서 오류가 가장 많은 부분인지 확인할 수 있다.

이부분이 테스트를 통해서 코드를 향상시키는 최적화 방법이 적용되는 부분이다.

만약 부하 테스트를 통해 병목현상을 일으키는 부분을 찾을수만 있다면 서버는 응답시간을 획기적으로 줄일수 있을것이다. 또한 수정된 코드의 성능을 확인할수 있는 방법이 될수도 있다.

그렇기 때문에 부하 테스트를 통해서 코드를 개선해 보는것도 좋은 방법중 하나이다.


참고자료

Google Developers - HTTP/2 소개

Node.js API 서버 성능 개선기

7 ways to improve Node.js performance at scale

댓글남기기