pm2란?
pm2는 Node.js 애플리케이션을 관리하기 위한 프로세스 매니저로 애플리케이션을 백그라운드에서 실행하고, 자동으로 재시작하며, 여러 가지 기능을 제공한다.
설치와 실행
npm install pm2 -g를 실행하면 설치가 가능하다.
반드시 -g로 전역설치를 해야만 한다.
안그러면 command not found오류를 만나게 될 것이야~
기본 실행방법은 아래와 같다.
(참고로 내 node.js 푸시 서버 이름은 pushServer.js다.)
시작
pm2 start pushServer.js
중지
pm2 stop pushServer.js
만약 실행중인 프로그램을 또 실행하려 들면 기특하게도 이런 오류를 내뱉어준다.
pm2를 사용하는 이유는 로그아웃을 해도 pm2로 돌리면 나중에 관리가 되기 때문이다.
자동 재실행
여기가진 좋다.
그.런.데
내가 만든 푸시 서버 node.js는 node-cron을 사용하여 1분마다 체크 로직이 들어있는데 이상한게 계속 메모리 점유율이 올라갔다. 59M .. 60M .. 71M ...
의심가는 로직을 주석처리 해보고 별짓 다 해봐도 아무리 용을 써도 메모리 점유율이 그대로였다.
node-cron만 사용하면 그랬다.
혹시나 싶어 pm2 대신 그냥 node pushServer.js로 실행한들 동일했다.
그러다 pm2는 자동 재실행하거나 메모리 사이즈가 일정 수치를 넘어서면 자동 재실행 등 다양한 옵션질이 가능하니 이를 활용하기로 했다.
일단 메모리 오버시 자동 재실행을 하기 위해선 별도의 js를 만들어야 한다.
이름은 process.config.js라 지었다.
module.exports = {
apps: [{
script: "pushServer.js",
instances: "max",
exec_mode: "cluster",
max_memory_restart: '100M' // 프로세스의 메모리가 100MB에 도달하면 reload 실행
}]
};
이 process.config.js를 저장하고 실행을 시킨다.
pm2 start process.config.js (종료는 pm2 stop process.config.js)
이 경우 인스턴스가 max로 되어 있는데
내 경우 새벽 3시마다 재실행을 하고 싶고 1개의 인스턴스만 실행되어야 하므로 내용을 이렇게 바꿔줬다.
max대신 1, cluster대신 fork
module.exports = {
apps: [{
name: "pushServer",
script: "/node/push/pushServer.js",
instances: 1,
exec_mode: "fork",
cron_restart: '0 3 * * *',
log: "/node/push/log/pushServer.log",
}],
}
이후 pm2 start process.config.js를 실행하면 알아서 잘 동작한다.
해당 파일안의 script를 원하는 인스턴스의 개수 만큼 실행해주고 로그 또한 원하는 위치에 만들어준다.
혹시라도 실수로 instances를 이미 max로 실행해서 프로세스가 여러개 생성되었다면 pm2 list를 실행해보고
pm2 delete all 명령어로 깨끗하게 다 지워버리면 된다.
성형 후 다시 새롭게 시작할 수 있다.
모니터링
실행중인 node.js 프로그램의 상태를 확인하고 싶다면 monit 기능을 이용하면 된다.
pm2 monit
좌측 상단엔 실행중인 프로세스 리스트로 화살표로 이동이 가능하다.
우측 하단에 Metadata에서 앱 이름과 버전 재실행 횟수 실행기간 등등 정보와
좌측 하단엔 메모리 정보들을 확인 가능하다.
모니터 툴을 빠져나올 땐 ctrl+c로 빠져나오면 된다.
하단에 기본적인 사용 안내가 나와있는것을 확인할 수 있다.
로그파일
pm2로 실행중인 node.js 프로그램에서 console.log를 찍으면 로그가 .pm2/logs 폴더에 파일로 계속 쌓이는데 이것도 로그 파일 사이즈별로 컨트롤이 가능하다.
이거 안해주면 나중에 어마어마한 사이즈의 로그파일을 경험하게 되니 반드시 해주자.
방법은 특이하게 npm i가 아닌 pm2 install pm2-logrotate 이렇게 설치해야 한다.
당연히 pm2는 제일 위에 언급하였듯이 npm으로 설치를 미리 해두어야 한다.
pm2 set pm2-logrotate:max_size 1K 또는 pm2 set pm2-logrotate:max_size 1M 이런식으로 실행 후 pm2 start pushServer.js를 실행하면 이후 console.log로 찍은 로그는 저 사이즈를 넘을 경우 자동으로 새로운 파일이 생성된다.
만약 이것도 싫고 하루마다 파일을 생성하고 싶다면?
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
끝으로 자동재실행까진 괜찮은데 이 경우 메모리 누수가 발생하는건 아닌가 불안하다.
여기까진 확인을 못해봤다.
'JAVA' 카테고리의 다른 글
이클립스(Eclipse)에서 검색된 결과 클릭시 무조건 새 탭으로 보기 (0) | 2024.05.08 |
---|---|
작심하고 불편하게 만든 토드(toad) 주석 이탤릭 기울임 폰트 해제하기 (0) | 2024.01.30 |
리눅스(cent os)에서 좀비 프로세스 kill 시키기 (0) | 2024.01.22 |
svn 모르고 이클립스에서 삭제했을 때 복구하는 방법 (0) | 2024.01.19 |
이클립스 기본 controller class와 mapper, xml 만드는 법 (0) | 2024.01.19 |