node进程管理

2016年8月19日

背景

node是在V8引擎(chrome浏览器的内核)上构建,所以跟浏览器类似,javascrit是运行在单个进程的单个线程上。

单线程优点

所以每来一个请求,都用同一个常驻内存的线程进行处理。php是每来一个请求,都要创建一个线程来响应。从这点上看node在连接上比php是有优势的。

单线程缺点

单进程,单线程,只支持单核CPU,不能充分的利用多核CPU服务器。一旦这个进程崩掉,那么整个web服务就崩掉了。

使用多进程

不过这个缺点可以使用多进程来弥补,一般cpu有几个核我们就可以启用几个进程,这样就可以充分利用cpu。如可以启用多进程,监听不同端口,然后通过webserver(如nginx)做负载均衡来调用。同时也可以通过创建子进程的方式来实现,node可以痛过child_process.fork()来创建子进程。解决多核cpu的利用率问题。node在v0.8版本后引入了cluster模块,用以处理进程的健壮性问题。如下示例:

if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('exit', function(worker, code, signal) {
        cluster.fork();
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World!');
        console.log('Worker #' + cluster.worker.id + ' make a response');
    }).listen(3000, '127.0.0.1');
}

我的电脑是4个核的,所以会创建4个子进程,此时查看进程发现有5个进程,即1个是主进程,4个子进程,可看出每个进程初始就占了大约10M的内存。
node进程

注意的地方

再讨论多进程好处的时候我们也要注意一些问题,因为node在设计之初就是比较轻量级的,所以我们还是要保证node要足够的轻。

node的这些子进程每个都是v8下一个完全独立的新实例,假定每fork一个新的个进程都会消耗30ms和10M的内存,所以我们也不能创建过多的进程。

最后,我们要注意的是多进程,每个进程都是一个独立的实例,并且每个实例只能处理它所连接上的。所以如果同时有多个请求过来,由不同的进程来进行处理,但它们需要共享一些状态,可以通过一些类似redis这样的缓存来共享存储。