Node.js의 싱글 스레드

Untitled

How does a single thread run on multiple cores?

<aside> 💡 여러 개의 코어가 있는 경우 운영 체제는 코어에서 실행할 가장 적격한 N개의 스레드를 예약합니다.

여러 CPU에서 동시에 하나의 스레드를 실행할 수는 없습니다.

</aside>

사실 I/O나 네트워크 관련된 작업은 문제가 되지 않는다. 

하지만 CPU 집약적 작업을 처리하는(동기식으로 실행되는 코드) 작업이 10초 이상 걸린다면
이 작업으로 인해 다른 요청이 10초동안 차단된다. 
즉, 서버에 많은 요청이 동시에 들어왔을 때 
서버가 이들을 빠르게 연산할 수 있는 조건이 됨(코어가 여러 개)에도 불구하고 
이를 활용하지 못해 응답을 지연시키는 일이 발생

물론 `setImediate`같이 연산 작업을 비동기로 위임할 수 있지만, 
이를 코드를 통해 로직을 관리해야 하는 불편함이 생긴다

Cluster 모듈 사용

import cluster from 'cluster';
import { cpus } from 'os';
import process from 'process';
import express from "express";

const numCPUs = cpus().length;

if (cluster.isPrimary) {
  // Fork workers
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  const app = express();
	
	app.get("/", (req, res) => {
	  let variable = 0;
	  for (let i = 0; i < 1000000; i++) {
	    variable += i;
	  }
	  res.status(200).send(`result : ${variable}`);
	});
	
	app.listen(8080);
}
// app.js
const app = express();
	
app.get("/", (req, res) => {
  let variable = 0;
  for (let i = 0; i < 1000000; i++) {
    variable += i;
  }
  res.status(200).send(`result : ${variable}`);
});

app.listen(8080);

// Shell : pm2 start app.js -i max

목표 테스트 환경 및 설계

CPU : AMD Ryzen 5 5600H (3.30 GHz) - 6코어 12스레드

RAM : 16GB

Untitled