10

私はプロセス間通信に手を出しています。目的は、いくつかの計算を実行し、結果を制御プロセスに返すワーカー プロセスを用意することです。zeromq.nodeをインストールし、coffeescript で簡単なリクエスターとレスポンダーをセットアップしました。

依頼者:

# 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、Intel Duo Core 3GHz、NodeJS 0.8.6) マシンの別のターミナル ウィンドウでそれらを実行すると、次の出力が得られます。

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) 速度が足りないと感じる。このベンチマークによると、1 秒あたりのメッセージ数は数千ではなく数十万になるはずです。これは、このディスカッション(「ZeroMQ: 10,000 メッセージを受信するのに約 15 ミリ秒かかる」) によって裏付けられています。

また、Python 3 で記述されたレスポンダーを使用しようとしましたが、まったく同じ数値が得られました。さらに、マスター プロセスが子プロセスを生成し、stdout/stdin を介して子プロセスと通信する別のスクリプト ペアを作成しました。1 秒あたり約 750 のメッセージを取得しました (メッセージの長さを増やしてもあまり変化は見られませんでした)。これは、zeromq の実験とほぼ同じです。

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

4

1 に答える 1

7

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

また、要求/応答モデルは同期的です。リクエストはソケットで受信され、レスポンスが返されるまでブロックされます。応答により、次の要求が処理され、ブロックされます。

リクエスタ スクリプトをsocket = zmq.socket 'req'からsocket = zmq.socket 'push'およびsetInterval ( -> socket.send 'helo world' ), 0に変更しましたsocket.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
...

while ループでブロックされていたため、リクエスタは出力を取得しませんでしたが、ØMQ がはるかに優れたパフォーマンスを実現できることを示しています。

于 2013-05-06T23:06:44.003 に答える