1

私は現在、いくつかのクライアントのタスクを取得して処理するサーバーを備えたシステムを開発しています。

高いスループットが必要なため、1Gbit ネットワークでの往復/秒の速度を調べました。

シナリオ:

  • クライアントにはディーラー ソケットがあり、サーバーにタスクを送信し、サーバーはルーター ソケット (TCP 接続) でタスクを受信します。
  • サーバーはタスクを 1 つのワーカー スレッド (ディーラー - INPROC 経由のディーラー) に転送します。
  • ワーカー スレッドはタスクを処理し、同じ方法で応答を返します。

ベンチマークには、16 台のマシンで 16 台のクライアントを使用しました。

ベンチマーク 1: (ワーカーなしで、サーバーはメッセージをクライアントに直接送信します) 結果:

  • 1B-メッセージ: 143540,67 RT/s (RT = 往復)
  • 10B-メッセージ: 140160,72 RT/秒
  • 100B-メッセージ: 129634,43 RT/秒
  • 500B-メッセージ: 120977,5 RT/s
  • 1024B-メッセージ: 107983,59 RT/秒

ベンチマーク 2: (worker が 10 の場合、サーバーは単にブローカーとして機能します)

  • 1B-メッセージ: 92873,51 RT/s (RT = 往復)
  • 10B-メッセージ: 81619,33 RT/秒
  • 100B-メッセージ: 83606,02 RT/秒
  • 500B-メッセージ: 75229,45 RT/秒
  • 1024B-メッセージ: 63648,32 RT/s

ソース:

ワーカー スレッドを使用して inproc-roundtrip を追加するだけで TP がそれほど低下する理由を特定するのを誰かが手伝ってくれますか? ワーカー スレッドでより高い TP を期待していました。ZMQ Inproc Performance はそれほど速くないのですか?

4

1 に答える 1

0

ZMQ_ROUTER/ZMQ_DEALER ソケットに正しいパターンを使用していません。

擬似コードは

front = zmq_socket (context, ZMQ_ROUTER);
zmq_bind(front, "tcp://*:15555");
back = zmq_socket(context, ZMQ_DEALER);
zmq_bind (back, "inproc://abc");
// Here create thread
zmq_proxy(front, back, NULL); // zmq_proxy will not return

スレッドの擬似コードは

socket = zmq_socket(context, ZMQ_REP);
zmq_connect(socket, "inproc://abc");
do {
   zmq_recv(...)
   zmq_send(...)
} while (1);

クライアントの擬似コードは

socket = zmq_socket(context, ZMQ_REQ);
zmq_connect(socket, "tcp://127.0.0.1:15555");
do {
   zmq_send(...)
   zmq_recv(...)
} while (1);
于 2013-05-24T13:53:04.897 に答える