반응형

문제 사항

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배 정도 빨라졌다.

 

설정을 잘 건드리자

반응형
얼은펭귄