还在为node运行于单进程而苦恼么?即便是node本身提供了cluster功能,或者在github和npm上有很多优秀的模块帮你做封装,但你仍然逃避不掉这些问题:
- 性能问题;
- 多进程worker的存活状态管理;
- 服务的平滑重启;
- 配置或者静态数据的动态reload.
我相信你完全有能力把这些事情做得很好。但在自己动手之前,为何不尝试一下node-cluster呢? https://github.com/aleafs/node-cluster
node-cluster只有一个文件,区区500多行代码(包括注释),为你解决了上面的所有问题。利用node-cluster构建你的多进程服务非常简单:
在master进程中,你只需要5行代码:
var cluster = require('node-cluster');
var master = new cluster.Master(); master.register(8080, ‘app.js’); master.dispatch();
在worker进程中,你只需要关心你的app逻辑即可。一个基于HTTP协议的典型例子如下:
var Http = require('http'); var cluster = require('node-cluster');
var admin = new cluster.Worker(); var server = Http.createServer(function (req, res) { admin.transact();
res.writeHead(200, {’Content-Type’: 'text/plain;charset=utf-8’}); res.end(‘hello world’);
admin.release(); });
admin.ready(function (socket) { server.emit('connection’, socket); });
实际上,我设计node-cluster的初衷可不只是这点用途。糯米们都能发掘出哪些应用场景呢?
在一台超线程可见 5 * Intel® Xeon® CPU E5620 @ 2.40GHz 的虚拟机上用siege2.7本机压测,demo/main.js 下的33749端口,与node原生的http模块进行对比。由于基本不涉及IO操作,保证压测时工作进程CPU吃满,结果如下:
**connection: keep-alive模式下(长连接):siege -b -c2 -t1m **
- 原生HTTP,时长59.76s,QPS:8486.93,请求数507179,可用率100.00%;
- node-cluster,时长59.64s,QPS:8424.51,请求数502438,可用率100.00%;
**connection: close模式下(短连接):siege -b -c1000 **
- 原生HTTP,时长24.15s,QPS:4907.33,请求数118512,可用率99.93%;
- node-cluster,时长20.71s,QPS:3864.61,请求数80036,可用率100.00%;
结论如下:
- 长连接模式下HTTP协议无性能损失。这个容易理解,一旦连接建立,之后的请求就与master无关了;
- 短连接模式下,node-cluster封装之后有20%的QPS损失。在短连接模式下,操作系统的文件句柄数首先达到瓶颈。在测试之前,手工通过ulimit -n调整 max opend files为65535,并且在TIME_WAIT状态的TCP连接数小于100的情况下开始压测。
- 普遍而言,node的HTTP模块在短连接模式下,比长连接有接近50%的QPS损失。这一点要根据node的使用场景来判断用那种模式。在node做中间层服务时,我们建议采用keep-alive方式。
function listenAt(obj, port) {
var server = new TCP();
server.bind('0.0.0.0', port);
server.listen('/dev/null');
server.listen('/dev/null');
有具体含义吗?
我下了node-cluster的后续改进版pm,但是运行demo中的master.js(node master.js)时报错误:
var b = process.binding(‘signal_watcher’);no such module
我看了master.js以及其引用的js均没有 var b = process.binding(‘signal_watcher’);此行代码,
而查看process的api文档以及child process 均没有binding方法,请问此为什么原因?该项如何解决?另外,我想在tcp请求中用上pm解决多核多进程问题,该如何使用?