Skip to content

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.js
js
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)

Released under the MIT License.