2013-03-01 59 views
10

我在进行流程间的沟通;目标是让工作进程执行一些计算并将结果传递回控制进程。我安装了zeromq.node,并设置了一个简单的请求者和响应者在咖啡脚本。ZeroMQ的预期性能是什么?

请求者:

# requester.coffee 

zmq      = require 'zmq' 
context     = new zmq.Context() 
socket     = zmq.socket 'req' 

socket.bind 'tcp://127.0.0.1:5555', (error) => 
    throw error if error? 
    console.log 'Requesting writer bound to port 5555' 
    setInterval (-> socket.send 'helo world'), 1 


response_count = 0 
t0    = new Date()/1000 

socket.on 'message', (message) -> 
    response_count += 1 
    # x = message.toString 'utf-8' 
    if response_count % 1000 is 0 
    t1    = new Date()/1000 
    console.log "received #{ parseInt response_count/(t1 - t0) + 0.5 } messages per second" 
    response_count = 0 
    t0 = new Date()/1000 

,应答器:

# responder.coffee 

zmq      = require 'zmq' 
context     = new zmq.Context() 
socket     = zmq.socket 'rep' 

socket.connect 'tcp://127.0.0.1:5555' 
console.log 'Responder bound to port 5555' 
process.stdin.resume() 

request_count = 0 
t0    = new Date()/1000 

socket.on 'message', (message) -> 
    request_count += 1 
    # message = message.toString 'utf-8' 
    # console.log message 
    socket.send 'helo back' 
    if request_count % 1000 is 0 
    t1    = new Date()/1000 
    console.log "received #{ parseInt request_count/(t1 - t0) + 0.5 } messages per second" 
    request_count = 0 
    t0 = new Date()/1000 

现在,当我在我的Ubuntu(11.10运行它们在不同的终端窗口,8GB,英特尔双核心3GHz的,0.8.6的NodeJS )机器,我得到以下输出:

received 135 messages per second 
received 6369 messages per second 
received 6849 messages per second 
received 6944 messages per second 
received 7042 messages per second 
received 7143 messages per second 
received 5952 messages per second 
received 2967 messages per second 
received 914 messages per second 
received 912 messages per second 
received 928 messages per second 
received 919 messages per second 
received 947 messages per second 
received 906 messages per second 
received 918 messages per second 
received 929 messages per second 
received 916 messages per second 
received 917 messages per second 
received 916 messages per second 
received 928 messages per second 

哪个(1)看起来有点像有某种satu几秒钟之后传输通道中的配给; (2)感觉不够快。根据this benchmark,我应该每秒处理数十万条 - 而不是数千条 - 这是this discussion(“ZeroMQ:接收10,000条消息需要大约15毫秒”)。

我也试图使用python 3编写的响应程序,并得到完全相同的数字。更重要的是,我编写了一对替代脚本,其中主进程生成一个子进程并通过stdout/stdin与它进行通信;我每秒获得大约750条消息(当我增加消息长度时,我看不到太多变化),这与zeromq实验的情况类似。

这些数字是预期的吗?这里的限制因素是什么?

+3

同步REQ-REP是主要限制,有关提高性能比率的更多异步示例,请参见指南。 – 2013-03-01 15:33:27

+0

不知道我是否正确理解你,但无论我打开多少响应者终端,请求者的报告速率始终保持在900 mps范围内。现在请求者肯定没有阻塞,并且它尽可能快地发送请求 - 至于nodej上的javascript,肯定比每毫秒1个请求更快? – flow 2013-03-01 15:56:12

+1

你有'setInterval ... 1',这是不是表示它每毫秒只发送一条消息?这会给你一个1k信息/秒的上限。如果你真的想看到它的限制,删除setInterval,并将socket.send放在请求者的'on'消息'块中。 – minrk 2013-03-02 01:29:07

回答

7

我觉得有两件事情正在进行。首先,你有setInterval (-> socket.send 'helo world'), 1。这会每毫秒发送一个请求,因此您将被限制为每秒1000个请求。

此外,请求/响应模型是同步的。一个请求进入套接字并阻塞,直到给出响应。通过该响应,下一个请求被处理并被阻止。

我改变了请求脚本socket = zmq.socket 'req'socket = zmq.socket 'push'setInterval (-> socket.send 'helo world'), 0socket.send 'helo world' while true。然后我改变了响应脚本socket = zmq.socket 'rep'socket = zmq.socket 'pull'和得到这个输出

$ coffee responder.coffee 
Responder bound to port 5555 
received 282 messages per second 
received 333357 messages per second 
received 249988 messages per second 
received 333331 messages per second 
received 250003 messages per second 
received 333331 messages per second 
received 333331 messages per second 
received 333331 messages per second 
... 

的请求没有得到输出,因为它挡住的,而循环,但它确实表明,ØMQ可以得到更好的性能。