- 학습 목표 1. pm2
- 학습 목표 2.
Got an error reading communication packets
- 학습 목표 3.
PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR
Node.js의 프로세스 매니저
Node.js는 싱글 스레드이다.. 단일 cpu 코어이기 때문에 실제 서버가 낼 수 있는 성능보다 떨어지는 참사가 벌어진다.
이런 문제를 해결하기 위해 사용하는 게 클러스터 모듈이다.
클러스터 모듈은 단일 프로세스를 멀티 프로세스로 늘릴 수 있는 방법을 제공한다.
- fork mode
pm2 start index.js
index.js 코드를 데몬화 하고 모니터링할 수 있다.
- cluster mode
pm2 start index.js --name 'myapp' --instance max
cpu 코어 수에 맞춰서 인스턴스를 자동 분배한다.
모든 cpu를 사용하기 위해서는 cluster mode로 실행해야 한다.
여러 프로세스가 독립적으로 실행된다.
사건의 발단
며칠 전 서버 EC2와 DB EC2를 종료했었다. 그리고 오늘 다시 키고 바뀐 엔드포인트를 적용했는데 브라우저에서 데이터가 로드가 안 되었다.
서버 터미널에는 DB 데이터가 잘 보였는데 브라우저에서 안 보이는 점이 이상했다.
그래서 엔드 포인트도 바꿔보고 elastic ip도 붙혀보고 구글링도 계속 해봤지만 고치지 못했다!
일단 이 에러와 함께 타임 아웃 에러도 났기 때문에 뭔가 mysql에 많은 요청이 가는 것처럼 보였다.
그래서 gpt를 잡고 계속 원인을 알아보다가 mysql connection 방식을 바꿔보게 되었다.
현재 내가 사용하던 방식은 mysql connection pool이다.
pool 방식은 다수의 연결을 미리 생성해두고 쿼리를 실행할 때마다 빌려서 쓰고 풀로 반환하는 방식이다.
그러나 위 방법으로도 해결이 안 되었고 pm2 실행 방식을 변경하게 되었다. 😐
pm2 start index.js --watch --name "myapp" --instances 1
클러스터 모드로 실행하면 여러 프로세스가 각자 MySQL 연결을 관리하므로 리소스 할당에서 기존의 fork mode보다 안전하게 운영할 수 있는 거 같다.
- 오늘 하루종일 에러 고치는데 시간을 썼다. 꼭 내가 해결해보고 싶어서 이것저것 많이 찾아보았다. mysql pool connection 방식은 처음 알게되었는데 조금 더 자세히 공부해보고 필요할 때 써먹어야겠다.