문제 사항
aws EC2 인스턴스에서 t2.medium 사양으로 pm2의 cluster mode로 node.js 서버를 4개 켜서 운영 하던 도중 pm2 명령어와 서버의 응답 속도가 너무 느린 문제가 발생했다.
원인 추정
원인은 너무 다양할 수 있었다. 크게 추렸을 때 아래와 같은 문제가 발생할 수 있을 것 같아서 추린 후 하나하나씩 검증했다.
띄워놓은 노드 서버의 응답 속도가 느린가?
실제 로컬에서 노드 서버를 띄웠을 때의 응답 속도는 10~100ms 사이 정도 였다.
하지만 pm2 노드 서버에서 응답이 느린건 2000ms 정도 되는것도 있었는데, ec2 인스턴스가 있는 물리적 위치를 감안했을 때 실제로 말도 안되게 차이가 났다.
결론: 노드 서버의 응답 속도는 크게 느리지 않다.
서버의 메모리가 딸리나?
그렇지 않았다. 실제 리눅스 서버의 메모리 사용량은 10% 정도 였으며 pm2 monit 명령어로 확인한 각각의 서버도 메모리를 250MB이상 먹고 있지 않았다.
결론: 서버의 메모리가 부족해서 생기는 문제는 아니다.
그럼 PM2의 설정을 잘못 건드렸나?
이게 정답이였다. 나머지 설정은 모두 맞았지만 인스턴스의 갯수를 임의로 건드린게 문제였다.
// ecosystem.config.js
// pm2가 실행시킬 설정 파일
const packageJson = require('./package.json');
module.exports = {
apps : [{
name: 'TEST',
version: `0.0.0`,
script: "app.js",
instances : "4",
exec_mode : "cluster",
max_memory_restart: "1G"
}]
}
위의 코드가 실제 서버로 올라갔던 환경설정 파일이였는데 여기서 instnaces: "4"는 인스턴스를 4개를 켠다는걸 의미한다.
하지만 t2.medium의 경우 vCPU가 2개인데, 실제 서버에서는 인스턴스를 4개를 켜놔서 각 인스턴스가 서로 CPU를 얻으려고 경쟁하는 CPU 경쟁 상태로 돌입한 것으로 추정되었다.
해결 및 결론
AWS 공식문서에는 사양이 t3 부터 써져 있기에 직접 검증을 해봤다. 실제로 instances의 값을 4가 아닌 max(켤 수 있는 최대 인스턴스 갯수만큼)로 두었을 때 서버에서는 pm2 인스턴스가 2개만 켜졌다.
// ecosystem.config.js
// pm2가 실행시킬 설정 파일
const packageJson = require('./package.json');
module.exports = {
apps : [{
name: 'TEST',
version: `0.0.0`,
script: "app.js",
// instances : "4",
instances : "max",
exec_mode : "cluster",
max_memory_restart: "1G"
}]
}
pm2 인스턴스를 2개만 켯을 때 실제로 pm2 shell의 반응속도가 엄청나게 빨라졌고 서버의 응답 속도도 최대 10배 정도 빨라졌다.
설정을 잘 건드리자
'Linux' 카테고리의 다른 글
[Ubuntu] Please install all available updates for your release before upgrading 문제 해결 (0) | 2024.01.10 |
---|---|
[Linux] Terminal에서 문자열을 base64로 인코딩 하는 방법 (0) | 2023.03.17 |
[Linux] ubuntu 버전 확인하기 (0) | 2022.06.11 |
[Linux] ubuntu 에서 포트 확인하는 방법 (0) | 2022.06.02 |
[Linux] vim 수정중 can't open file for writing 오류 (0) | 2022.05.10 |