cluster란?
기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
[특징]
- 포트를 공유하는 노드 프로세스를 여러 개 둘 수 있음
- 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됨 -> 서버에 무리가 덜 담
- 예) 코어가 8개인 서버가 있을 경우 노드는 기본적으로 코어를 하나만 활용함. 그러나 cluster 모듈을 설정하여 코어 하나당 노드 프로세스 하나가 돌아가게 할 수 있음. 성능이 꼭 8배가 되진 않지만 하나만 사용할 때에 비해 당연히 성능이 개선됨.
- 단점) 컴퓨터 자원(메모리, 세션 등) 공유 못함. 각각 독립적인 프로세스를 띄우는 것이기 때문에 서로 공유가 안 됨.
-> Redis 등의 서버를 도입하여 해결 가능
[코드]
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) { // 마스터
console.log(`마스터 프로세스 아이디: ${process.pid}`);
for (let i = 0; i < numCPUs; i += 1) {
cluster.fork();
}
// 워커가 종료되었을 때
cluster.on('exit', (worker, code, signal) => {
console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
console.log('code', code, 'signal', signal);
cluster.fork();
});
} else { //워커
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Cluster!</p>');
setTimeout(() => { // 워커가 존재하는지 확인하기 위해 1초마다 강제 종료
process.exit(1);
}, 1000);
}).listen(8086);
console.log(`${process.pid}번 워커 실행`); // 프로세스 고유 자식 id
}
[결과]
cluster.fork()
fork는 프로세스를 복제하는 방법-> 자식 프로세스가 됨
클러스터에는 마스터 프로세스와 워커 프로세스가 있다. 마스터 프로세스는 CPU 개수만큼 워커 프로세스를 만들고, 8086번 포트에서 대기한다. 요청이 들어오면 만들어진 워커 프로세스에 요청을 분배한다.
마스터 프로세스 : 부모 프로세스
워커 프로세스 : 자식 프로세스
-> 각 자식 프로세스 안에 스레드가 여러 개 구성되어 있음
round robin 방식
CPU 코어와 스레드
[참고]
https://programmingsummaries.tistory.com/384
[NodeJS] 클러스터(cluster)에 대한 정리
들어가며 node.js는 기본적으로 하나의 프로세스가 32bit에서는 512MB의 메모리, 64Bit에서는 1.5GB 메모리를 사용하도록 제한되어 있다. V8엔진의 제한을 그대로 반영한 것인데, 물론 설정으로 더 늘릴
programmingsummaries.tistory.com
https://lgphone.tistory.com/67
Node.js - 클러스터 (Cluster)
cluster 모듈은 기본적으로 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈이다. 포트를 공유하는 노드 프로세스를 여러 개 둘 수 있으므로 요청이 많이 들어올 시
lgphone.tistory.com
[NODE] 📚 클러스터(cluster) 모듈 - 멀티 프로세서
Cluster 기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈 포트를 공유하는 노드 프로세스를 여러 개 둘 수 있음 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수
inpa.tistory.com
'인턴(2023.07. ~ 2023.12.) > 스크립트 송출 서버 개발' 카테고리의 다른 글
Node.js http 모듈 (0) | 2023.08.17 |
---|---|
인메모리 컴퓨팅 (0) | 2023.08.10 |
HTTP와 HTTPS (0) | 2023.08.09 |
웹 서비스 구조 (0) | 2023.08.08 |
Node.js 란? (0) | 2023.08.08 |