How does a single thread run on multiple cores?
<aside> 💡 여러 개의 코어가 있는 경우 운영 체제는 코어에서 실행할 가장 적격한 N개의 스레드를 예약합니다.
여러 CPU에서 동시에 하나의 스레드를 실행할 수는 없습니다.
</aside>
사실 I/O나 네트워크 관련된 작업은 문제가 되지 않는다.
하지만 CPU 집약적 작업을 처리하는(동기식으로 실행되는 코드) 작업이 10초 이상 걸린다면
이 작업으로 인해 다른 요청이 10초동안 차단된다.
즉, 서버에 많은 요청이 동시에 들어왔을 때
서버가 이들을 빠르게 연산할 수 있는 조건이 됨(코어가 여러 개)에도 불구하고
이를 활용하지 못해 응답을 지연시키는 일이 발생
물론 `setImediate`같이 연산 작업을 비동기로 위임할 수 있지만,
이를 코드를 통해 로직을 관리해야 하는 불편함이 생긴다
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);
}
PM2
를 활용하여 해결한다.// 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