[ 이 게시물은 2012-09-02 현재 최신 상태입니다. ]
Node.js는 멀티 코어 머신에서 절대적으로 확장됩니다.
예. Node.js는 프로세스 당 하나의 스레드입니다. 이것은 매우 신중한 디자인 결정이며 잠금 의미론을 처리 할 필요가 없습니다. 이것에 동의하지 않는다면 아마 멀티 스레드 코드를 디버깅하는 것이 얼마나 어려운지 알지 못할 것입니다. Node.js 프로세스 모델에 대한 자세한 설명과 왜 이런 방식으로 작동하는지 (그리고 여러 스레드를 지원하지 않는 이유) 다른 게시물을 읽으십시오 .
16 코어 박스를 어떻게 활용합니까?
두 가지 방법:
- 이미지 인코딩과 같은 대규모 컴퓨팅 작업의 경우 Node.js는 하위 프로세스를 시작하거나 추가 작업자 프로세스로 메시지를 보낼 수 있습니다. 이 디자인에서는 하나의 스레드가 이벤트 흐름을 관리하고 N 개의 프로세스가 많은 컴퓨팅 작업을 수행하고 다른 15 개의 CPU를 씹습니다.
- 웹 서비스의 처리량을 조정하려면 하나의 상자에서 여러 개의 Node.js 서버를 코어 당 하나씩 실행하고 요청 트래픽을 분할해야합니다. 이는 탁월한 CPU 선호도를 제공하며 코어 수에 따라 처리량을 거의 선형으로 확장합니다.
웹 서비스의 처리량 확장
v6.0.X Node.js에는 클러스터 모듈 이 기본적으로 포함되어 있어 단일 포트에서 청취 할 수있는 여러 노드 워커를 쉽게 설정할 수 있습니다. 이것은 npm을 통해 사용 가능한 이전 learnboost "cluster"모듈과 동일하지 않습니다 .
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
노동자들은 새로운 연결을 수용하기 위해 경쟁 할 것이며, 가장 적은 부하의 프로세스가 이길 가능성이 높습니다. 그것은 잘 작동하며 멀티 코어 박스에서 처리량을 상당히 확장시킬 수 있습니다.
여러 코어를 관리하기에 충분한로드가있는 경우 몇 가지 추가 작업을 수행하려고합니다.
Nginx 또는 Apache 와 같은 웹 프록시 뒤에서 Node.js 서비스를 실행하십시오 (오버로드 조건을 사용하여 상자를 완전히 중단시키지 않는 한), URL을 다시 쓰고 정적 컨텐츠를 제공하고 다른 서브 서비스를 프록시 할 수있는 연결 제한을 수행 할 수있는 것입니다.
작업자 프로세스를 주기적으로 재활용하십시오. 장기 실행 프로세스의 경우 작은 메모리 누수도 결국 더해집니다.
설정 로그 수집 / 모니터링
추신 : 다른 글 (이 글을 쓰는 시점에서 가장 높은 글)에 대한 의견에서 Aaron과 Christopher 사이에 토론이 있습니다. 그것에 대한 몇 가지 의견 :
- 공유 소켓 모델은 여러 프로세스가 단일 포트에서 수신 대기하고 새로운 연결을 수락하도록 경쟁하는 데 매우 편리합니다. 개념적으로, 당신은 각 프로세스가 단일 연결 만 받아들이고 죽을 것이라는 심각한 경고와 함께 아파치 사전 아파치를 생각할 수 있습니다. Apache의 효율성 손실은 새 프로세스를 처리하는 오버 헤드로 소켓 작업과 관련이 없습니다.
- Node.js의 경우 N 작업자가 단일 소켓에서 경쟁하게하는 것이 매우 합리적인 솔루션입니다. 대안은 Nginx와 같은 온 박스 프론트 엔드를 설정하고 개별 작업자에게 프록시 트래픽을 보내 새로운 연결을 할당하기 위해 작업자를 번갈아 사용하는 것입니다. 두 솔루션은 매우 유사한 성능 특성을 가지고 있습니다. 위에서 언급했듯이 Nginx (또는 대안)가 노드 서비스를 향하게하고 싶을 것이므로 선택은 실제로 다음과 같습니다.
공유 포트 : nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
vs
개별 포트 : nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
개별 포트 설정에 약간의 이점이있을 수 있지만 (프로세스 간 연결이 적고,보다 정교한로드 밸런싱 결정 등이있을 수 있음), 설정 작업이 더 많고 내장 클러스터 모듈이 낮습니다. 대부분의 사람들에게 적합한 복잡한 대안.