私はプロセス間通信を手伝っています。目的は、いくつかの計算を実行し、その結果を制御プロセスに返すワーカープロセスを持つことです。私は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実験と同じようなものです。
これらの数字は予想されますか?ここでの制限要因は何ですか?
同期REQ-REPが主な制限です。パフォーマンス・レートを上げるための非同期の例については、ガイドを参照してください。 –
私はあなたを正しく理解していませんが、何人のレスポンダ端末を開いても、リクエスタの報告レートは常に900 mpsの範囲内にとどまります。今要求者は確かにブロックされていませんし、できるだけ早くリクエストを送信します - nodejsのjavascriptは確かに1ミリ秒あたり1リクエストより速いですか? – flow
あなたは 'setInterval ... 1'を持っています、それは1ミリ秒ごとに1つのメッセージしか送信しないということですか?それは1k msgs/secの上限を与えます。 setIntervalを削除し、本当にその制限を見たい場合は、要求側の 'on 'message'ブロックの中にsocket.sendを入れてください。 – minrk