2013-03-01 10 views
10

私はプロセス間通信を手伝っています。目的は、いくつかの計算を実行し、その結果を制御プロセスに返すワーカープロセスを持つことです。私はzeromq.nodeをインストールし、シンプルなリクエスタとレスポンダをcoffeescriptで設定しました。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、8ギガバイト、Intelのデュオコア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)数秒後に伝送チャネル内の占有量; (2)十分に速くないと感じる。 this benchmarkによれば、私はthis discussion( "ZeroMQ:1万メッセージを受信するのに約15ミリ秒かかります")で腐食された数十万〜数千のメッセージを1秒間に収める必要があります。

私はまた、python 3で書かれたレスポンダを使用しようとしましたが、まったく同じ番号を持っています。さらに、私はマスタープロセスが子プロセスを生成し、stdout/stdinを介してそれと通信する別のペアのスクリプトを書いた。私は約1秒間に750メッセージを取得しました(メッセージ長を増やしたときにはあまり変化が見られませんでした)。これはzeromq実験と同じようなものです。

これらの数字は予想されますか?ここでの制限要因は何ですか?

+3

同期REQ-REPが主な制限です。パフォーマンス・レートを上げるための非同期の例については、ガイドを参照してください。 –

+0

私はあなたを正しく理解していませんが、何人のレスポンダ端末を開いても、リクエスタの報告レートは常に900 mpsの範囲内にとどまります。今要求者は確かにブロックされていませんし、できるだけ早くリクエストを送信します - nodejsのjavascriptは確かに1ミリ秒あたり1リクエストより速いですか? – flow

+1

あなたは 'setInterval ... 1'を持っています、それは1ミリ秒ごとに1つのメッセージしか送信しないということですか?それは1k msgs/secの上限を与えます。 setIntervalを削除し、本当にその制限を見たい場合は、要求側の 'on 'message'ブロックの中にsocket.sendを入れてください。 – minrk

答えて

7

私は2つのことが起こっていると思います。まず、setInterval (-> socket.send 'helo world'), 1があります。これはミリ秒ごとに要求を送信するので、毎秒1000リクエストに制限されます。

また、要求/応答モデルは同期的です。要求はソケットに入り、応答が返されるまでブロックされます。応答では、次の要求が処理され、ブロックされます。

リクエスタスクリプトをからsocket = zmq.socket 'push'およびsetInterval (-> socket.send 'helo world'), 0からsocket.send 'helo world' while trueに変更しました。私はそれは、whileループでブロックされたが、それはØMQがはるかに優れた性能を得ることができることを実証しないため、依頼者が出力を得なかっ

$ 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 
... 

socket = zmq.socket 'pull'に応答スクリプトsocket = zmq.socket 'rep'を変更し、この出力を得ました。

関連する問題