프로그래밍 언어/HTML,CSS,JS

다중 코어 시스템의 Node.js

Rateye 2021. 10. 6. 10:54
728x90
반응형
질문 : 멀티 코어 머신의 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);
}

작업자는 새로운 연결을 수락하기 위해 경쟁 할 것이며로드가 가장 적은 프로세스가 이길 가능성이 높습니다. 그것은 꽤 잘 작동하고 멀티 코어 박스에서 처리량을 상당히 높일 수 있습니다.

여러 코어를 관리하기에 충분한로드가있는 경우 몇 가지 작업도 더 수행해야합니다.

  1. Nginx 또는 Apache 와 같은 웹 프록시 뒤에서 Node.js 서비스를 실행합니다. 연결 조절을 수행하고 (오버로드 조건으로 인해 상자가 완전히 중단되기를 원하지 않는 한), URL을 다시 작성하고, 정적 콘텐츠를 제공하고, 기타 하위 서비스를 프록시 할 수 있습니다.
  2. 작업자 프로세스를 주기적으로 재활용하십시오. 장기 실행 프로세스의 경우 작은 메모리 누수가 결국 더해집니다.
  3. 로그 수집 / 모니터링 설정

 


추신 : 다른 게시물의 의견에서 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
728x90
반응형