티스토리 뷰
express - pm2 cluster 적용기
(1) 도입을 고려하게 된 이유
- pm2 클러스터링 도입을 통해 서버의 성능과 안정성을 높일 수 있다.
- 오전 10시 반쯤 알수 없는 현상으로 서버가 다운되는 현상을 방지할 수 있을 것 같다.
(2) 현재 서버의 문제점
nodejs가 기본적으로 싱글스레드 라는 점 때문에, cpu의 멀티코어 시스템을 사용할 수 없다.
이러한 이유로, cpu intensive한 작업(복잡한 계산, 트래픽 과다 등)을 하게 될 경우 요청처리가 딜레이 되거나 심할 경우 서버거 멈추는 현상까지 발생 할 수 있다.
(3) 클러스터링 도입으로 인한 이점
클러스터 모듈을 통해 단일 프로세스를 멀티 프로세스로 늘림으로써, cpu의 멀티코어 시스템을 활용 할 수 있다.
- cpu작업량이 많아질 경우, 로드 밸런싱을 통해 효율성을 높일 수 있다.
pm2의 reload를 활용해 무중단 배포가 가능하다.
- 기존 process를 old_app으로 이동시키고, 새로 적용될 process를 new_app으로 올린다.
- new_app이 ready되기 전까지 old_app이 작동하고, new_app이 ready됨과 동시에 old_app 서비스를 끊어준다.
- 이러한 방식으로 무중단 배포가 가능하다.
(4) pm2 - config 및 app 설정
// deploy.config.json
{
"apps": [
{
"name": "miniintern-server",
"script": "./index.js",
"watch": false,
"instances" : 0, // cpu 코어 수만큼 프로세스 생성
"exec_mode" : "cluster", // 클러스터 모드 설정
"wait_ready" : true, // 앱이 실행되었다는 신호를 받는다.
"instance_var": "0",
"listen_timeout": 50000, // 앱 실행 신호까지 기다릴 최대 시간
// SIGINT -> SIGKILL 전송까지의 시간
// 새로운 프로세스 실행이 완료된 후 예전 프로세스를 교체하기 기다릴 시간
"kill_timeout": 5000,
"ignore_watch": ["node_modules"],
"env": {
"NODE_PATH": ".",
"NODE_ENV": "production"
}
}
]
}
// index.js
const server = app.listen(port, () => {
// pm2에 ready됐음을 알려준다.
process.send('ready');
});
// 새로운 app이 ready되면, 이전 app을 close한다.
process.on('SIGINT', function() {
server.close(function() {
console.log('server closed');
process.exit(0);
});
});
(5) Clustering 적용 전,후 부하테스트 실험 - 1
- artillery 라이브러리를 활용해 간단한 부하테스트를 진행했다.
// 아래 api를 호출해서 , 10000만명의 유저가 1번의 request를 보낼 경우를 테스트 했다.
npx artillery quick --count 10000 -n 1 <http://localhost:8080/api/v2/projects?limit=10&page=1&status=all>
클러스터링 적용 X
클러스터링 적용 O
[결과분석]
클러스터링 적용 전
- 1만개의 요청이 동시에 들어왔을때 3006개의 요청만 정상적으로 처리 되었다.
클러스터링 적용 후
- 1만개의 요청이 모두 정상적으로 처리 되었다.
공통
- 응답시간의 중간 값을 비교해봤을 때 클러스터링 적용 후와 큰 차이는 없다.
(5) Clustering 적용 전,후 부하테스트 실험 - 2
아래와 같은 api를 호출해, cpu에 과부화를 준 후, 다른 api를 호출하는 실험
exports.test = async (req, res, next) => {
const a = new Date().getSeconds();
while (a < 50) {
console.log(a);
}
res.send('finish');
};
[ 결과분석 ]
클러스터링 적용 전
- test api 가 종료 될 때 까지, 새롭게 들어온 api요청이 처리되지 않는다.
클러스터링 적용 후
- 로드밸런싱을 통해, test api를 처리하고 있는 process가 아닌 다른 process에 의해 api 요청이 처리된다.
'개발일기 > NODE' 카테고리의 다른 글
[nodejs] graphql playground cookie 심는 방법 (0) | 2022.12.13 |
---|
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 전기기사필기
- 전기산업기사
- 전기기사
- 개더타운
- dummydata
- 전자기학
- zep
- nextjs
- 산업안전기사 실기
- 전기기사 필기
- 모두CBT
- gathertown
- shortid
- 게더타운
- 전기기사실기CBT
- 게더타운맵
- React
- JavaScript
- 산업안전기사
- 전력공학
- fakerjs
- KEC반영
- cbt
- 전기기사실기단답
- 산안기 합격률
- 실기CBT
- TypeScript
- TS
- 전기공사기사
- 전기기기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함