CNode

master + worker模式的node多核解决框架——node-cluster

Ppengchun发布于14 年前最后回复10 年前27 回复27870 浏览0 收藏

var master = new cluster.Master(); master.register(8080, 'app.js'); master.dispatch();

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); });

查看回复

回复 (27)

K
kongwu#1·14 年前

期待性能数据!

P
pengchun#2·14 年前

在一台超线程可见 5 * Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 的虚拟机上用siege2.7本机压测,demo/main.js 下的33749端口,与node原生的http模块进行对比。由于基本不涉及IO操作,保证压测时工作进程CPU吃满,结果如下:

**connection: keep-alive模式下(长连接):siege -b -c2 -t1m **

  1. 原生HTTP,时长59.76s,QPS:8486.93,请求数507179,可用率100.00%;
  2. node-cluster,时长59.64s,QPS:8424.51,请求数502438,可用率100.00%;

**connection: close模式下(短连接):siege -b -c1000 **

  1. 原生HTTP,时长24.15s,QPS:4907.33,请求数118512,可用率99.93%;
  2. node-cluster,时长20.71s,QPS:3864.61,请求数80036,可用率100.00%;

结论如下:

  1. 长连接模式下HTTP协议无性能损失。这个容易理解,一旦连接建立,之后的请求就与master无关了;
  1. 短连接模式下,node-cluster封装之后有20%的QPS损失。在短连接模式下,操作系统的文件句柄数首先达到瓶颈。在测试之前,手工通过ulimit -n调整 max opend files为65535,并且在TIME_WAIT状态的TCP连接数小于100的情况下开始压测。
  1. 普遍而言,node的HTTP模块在短连接模式下,比长连接有接近50%的QPS损失。这一点要根据node的使用场景来判断用那种模式。在node做中间层服务时,我们建议采用keep-alive方式。
P
pengchun#3·14 年前

话说虚拟机真弱啊,在我的mac上,上边的测试,轻轻松松抛出两倍的QPS

F
fengmk2#5·14 年前

admin. transact()admin.release() 要使用者自行判断在那里调用?这样的使用体验不好啊。

应该让用户对这些没感觉才好,让他们使用起来就像普通的处理逻辑一样。

F
fengmk2#8·14 年前

@pengchun

function listenAt(obj, port) {
  var server  = new TCP();
  server.bind('0.0.0.0', port);
  server.listen('/dev/null');

server.listen('/dev/null'); 有具体含义吗?

F
fish#9·14 年前

@pengchun 同求解 :)

D
DoubleSpout#10·14 年前

我想问下,多进程内存共享后台有自动同步吗?比如我想同步一些json数据,但是又不想借助如redis,mongodb等的第三方缓存。

M
mackjoner#13·14 年前

master.register(8080, 'app.js'); 我想添加的是unix socket file,这个能做到吗,就是结合socket和node-cluster

H
huangqj#14·14 年前

我下了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解决多核多进程问题,该如何使用?

X
xuhaijinsky2008#17·14 年前
H
haiyupeter#20·14 年前

你好,我想问一下,通过child_process.fork()出来的子进程及该进程下的线程,如何保证是在不同的CPU核上运行的?

这个是由系统调用平均分配的吗?

L
liyatang#22·13 年前

你好,你的node-cluster地址坏了。求代码

F
fangker#23·10 年前

mark

M
MirrorWang#24·10 年前

mark 自豪地采用 CNodeJS ionic

Q
qianqing#25·13 年前

[worker:6591][Tue Nov 19 2013 16:59:36 GMT+0800 (CST)] Error: EPERM, Operation not permitted, ignore,我在linux下遇到这个错误,node版本是0.10.13,是什么原因呢?

参与回复
登录后即可参与回复。登录