2013-03-01 54 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可以得到更好的性能。