cluster ้็พค โ
Node.js ้ป่ฎคๆฏ ๅ็บฟ็จ + ไบไปถๅพช็ฏ๏ผๅช่ฝไฝฟ็จ 1 ไธช CPU ๆ ธๅฟใ ๅจๅคๆ ธๆบๅจไธ๏ผ่ฟไผๆตช่ดนๅคง้ๆง่ฝใ
cluster ๆจกๅๅ
่ฎธไฝ ๅจๅไธ็ซฏๅฃไธๅฏๅจๅคไธช worker ่ฟ็จ๏ผ่ฎฉ Node.js ๅ
ๅๅฉ็จๅคๆ ธ CPUใ
็ฎ็ โ
| ็ฎๆ | ่ฏดๆ |
|---|---|
| ๅฉ็จๅคๆ ธ | CPU ๆฏไธช worker ๅ ็จไธไธช CPU ๆ ธๅฟ |
| ๆๅๅๅ้๏ผQPS๏ผ | ๅค worker ๅนถ่กๅค็่ฏทๆฑ |
| ๆ้ซๅฏ็จๆง | worker ๅดฉๆบๅ master ่ชๅจๆ่ตท |
| ้ฟๅ ๅ็นๆ ้ | master ไธๅค็ไธๅก๏ผๅช่ด่ดฃ็ฎก็ worker |
ๅทฅไฝๅ็ โ
Master๏ผไธป่ฟ็จ๏ผ: ่ด่ดฃๅๅปบใ็ฎก็ worker๏ผไธๅค็ไธๅกWorker๏ผๅญ่ฟ็จ๏ผ: ็ๆญฃๅค็ HTTP ่ฏทๆฑ- ๆๆ worker ๅ ฑไบซๅไธไธช็ซฏๅฃ๏ผ็ฑ master ่ด่ดฃ่ฐๅบฆ๏ผ
่ฟ็จ โ
js
import os from 'os';
import cluster from 'cluster';
import http from 'http';
const cpuCount = os.cpus().length;
// console.log(cpuCount, "cpu ๆ ธๅฟๆฐ");
// console.log(cluster, "cluster ้็พคๆจกๅ");
if (cluster.isPrimary) {
// ๅฏๅจ worker
for (let i = 0; i < cpuCount; i++) {
cluster.fork();
}
// worker ๅดฉๆบ่ชๅจ้ๅฏ
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died. Restarting...`);
cluster.fork();
});
} else {
// Worker ่ฟ็จ
http.createServer((req, res) => {
res.writeHead(200);
res.end('cluster ๆๅกๅฏๅจๆๅ๏ผ\n');
}).listen(3000, () => {
console.log('ๆๅกๅจ่ฟ่กๅจ http://localhost:3000/');
});
}bash
ps aux | grep node
>>>
xx 67342 0.0 0.2 436128720 50688 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67341 0.0 0.2 436128656 49376 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67340 0.0 0.2 436128736 49360 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67339 0.0 0.2 436128816 50176 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67338 0.0 0.2 436128656 49168 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67337 0.0 0.2 436128480 48992 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67336 0.0 0.2 436128208 50224 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67335 0.0 0.2 436128032 49648 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67334 0.0 0.2 436128576 49472 s043 S+ 1:45PM 0:00.05 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67333 0.0 0.2 436128496 49840 s043 S+ 1:45PM 0:00.06 /Users/xx/.n/bin/node /Users/xx/Documents/ms/cluster/server.js
xx 67332 0.0 0.2 436128352 45600 s043 S+ 1:45PM 0:00.05 node ./server.jsjs
import http from 'http';
http.createServer((req, res) => {
res.writeHead(200);
res.end('ๆๅกๅฏๅจๆๅ๏ผ\n');
}).listen(3000, () => {
console.log('ๆๅกๅจ่ฟ่กๅจ http://localhost:3001/');
});ๅๆต โ
ไฝฟ็จ loadtest
bash
npx loadtest -n 100000 -c 1000 http://localhost:3000/
# >>>
Target URL: http://localhost:3000/
Max requests: 100000
Concurrent clients: 5000
Running on cores: 5
Agent: none
Completed requests: 100000
Total errors: 0
Total time: 7.519 s
Mean latency: 362.9 ms
Effective rps: 13300
Percentage of requests served within a certain time
50% 333 ms
90% 503 ms
95% 598 ms
99% 787 ms
100% 4493 ms (longest request)