질문 : 멀티 코어 머신의 Node.js
Node.js를가 흥미 보이지만, 뭔가 그리워한다 - Node.js를 단일 프로세스 및 스레드에서 실행 만 조정되지 않습니다?
그렇다면 멀티 코어 CPU 및 멀티 CPU 서버에 대해 어떻게 확장됩니까? 결국 가능한 한 단일 스레드 서버를 빠르게 만드는 것이 좋지만 부하가 높은 경우 여러 CPU를 사용하고 싶습니다. 응용 프로그램을 더 빠르게 만드는 것도 마찬가지입니다. 오늘날에는 여러 CPU를 사용하고 작업을 병렬화하는 방법이 있습니다.
Node.js는이 그림에 어떻게 들어 맞습니까? 어떻게 든 여러 인스턴스를 배포하는 아이디어입니까?
답변
Node.js는 절대적으로 멀티 코어 머신에서 확장됩니다.
예, Node.js는 프로세스 당 하나의 스레드입니다. 이것은 매우 신중한 설계 결정이며 잠금 의미를 처리 할 필요가 없습니다. 이에 동의하지 않는다면 멀티 스레드 코드를 디버깅하는 것이 얼마나 어려운지 아직 깨닫지 못했을 것입니다. Node.js 프로세스 모델에 대한 더 자세한 설명과 이것이 왜 이런 방식으로 작동하는지 (그리고 왜 다중 스레드를 지원하지 않는지), 저의 다른 게시물을 읽으십시오.
그렇다면 16개의 코어 박스를 어떻게 활용할 수 있을까요?
두 가지 방법:
- 이미지 인코딩과 같은 대규모 컴퓨팅 작업의 경우 Node.js는 하위 프로세스를 시작하거나 추가 작업자 프로세스에 메시지를 보낼 수 있습니다. 이 디자인에서는 이벤트 흐름을 관리하는 하나의 스레드와 무거운 컴퓨팅 작업을 수행하는 N 개의 프로세스와 나머지 15 개의 CPU를 씹게됩니다.
- 웹 서비스의 처리량을 확장하려면 하나의 상자에서 코어 당 하나씩 여러 Node.js 서버를 실행하고 이들간에 요청 트래픽을 분할해야합니다. 이는 뛰어난 CPU 친 화성을 제공하며 코어 수에 따라 거의 선형 적으로 처리량을 확장합니다.
웹 서비스의 처리량 확장
v6.0.X부터 Node.js에는 즉시 클러스터 모듈 이 포함되어 있으므로 단일 포트에서 수신 할 수있는 여러 노드 작업자를 쉽게 설정할 수 있습니다. 이것은 npm을 통해 사용할 수있는 이전 learnboost "클러스터"모듈과 동일하지 않습니다.
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를 생각할 수 있습니다. 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) ...}
개별 포트 설정에는 틀림없이 몇 가지 이점이 있지만 (프로세스 간 결합이 적고로드 밸런싱 결정이 더 정교 할 수 있음) 확실히 설정 작업이 더 많고 내장 클러스터 모듈이 낮습니다. -대부분의 사람들에게 적합한 복잡성 대안.
출처 : https://stackoverflow.com/questions/2387724/node-js-on-multi-core-machines
'프로그래밍 언어 > HTML,CSS,JS' 카테고리의 다른 글
setTimeout 과 setInterval의 차이 (0) | 2021.10.07 |
---|---|
JavaScript의 배열 객체 속성 순서에 대해서 (0) | 2021.10.06 |
JavaScript에서 여러 줄 문자열 만들기 (0) | 2021.10.06 |
AngularJS ngClass 조건부 (0) | 2021.10.05 |
mailto :를 사용하여 이메일 제목 / 내용을 설정하는 방법 (0) | 2021.10.01 |