node为javascript的平台。只支持单线程。启动一个node程序,只会占用一个cpu。浪费服务器性能。同时一个node进程并发量有限。
解决方案:
同时启动多个node进程,每个进程占用一个cpu。这样服务器利用率会提高同时提高并发量。node的cluster模块就提供了充分利用机器cpu内核开箱即用的解决方案

单进程示例

代码部分

//server.js
const http = require('http');
const pid = process.pid;
http.createServer((req, res) => {
    for(let i=0;i<1e7;i++) {} // simulate CPU work
    res.end(`handled by process.${pid}`);
}).listen(8080, () => {
    console.log(`started process`, pid);
});

ab压测

*每秒200个 10秒钟 *

 ./ab -c200 -t10 http://localhost:8080/


完成1008个请求,每秒处理100.77个请求(并发量)

多进程示例

多进程原理


主进程的工作很简单,因为它实际上只使用了一个调度轮询算法去选择一个工作进程。

示例代码

// cluter.js
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
    const cpus = os.cpus().length;
    console.log('forking for ', cpus, ' CPUS');
    for(let i = 0;i<cpus;i++) {
        cluster.fork();
    }
} else {
    require('./server.js');
}

ab压测


完成2924个请求,并发量292.28,每个请求耗时684.268毫秒

并发500,完成5000个请求

./ab -c500 -n5000 http://localhost:
8080/


耗时111.983秒

耗时18.166秒1个主进程,7个工作进程。约为单进程耗时的1/7.

总结

  1. node集群并发量有一定提升,并发量超过100建议使用nginx做负载均衡
  2. 单台nginx并发量不得超过5w,最好超过2w就是用dns做分流
Scroll to Top