2017-02-13 22 views
0

私はネットワーク転送アプリケーションを作成しようとしています。ZeroMQはboost asioよりも遅いですか?

データはバイナリデータで、各パケットサイズはほとんど800KBです。

クライアントは、毎秒1000データを生成します。できるだけ早くデータを転送したい。

私がZeroMQを使用すると、速度は350データ/秒に達するが、ブーストASIOは毎秒400(またはそれ以上)に達する。

ご覧のとおり、両方の方法のパフォーマンスは良くありません。

ZeroMQで使用されるパターンはPUSH/PULLパターンです。ブーストアシオはシンプルシンクI/Oです。

1:私は質問したいと思いますが、ZeroMQは小さなメッセージにのみ適していますか?

Q2: ZeroMQの速度を向上させる方法はありますか?

Q3: ZeroMQできない場合は、これらの種類のデータ転送を改善するために、いくつかの良い方法やライブラリをアドバイスしてください。

答えて

1

データレート

あなたは800メガバイト/秒を移動しようとしています。これはどんなつながりですか? tcp://トランスポートクラスの場合は、非常に高速である必要があります。 100ギガビット/秒イーサネット、かなりエキゾチックです。

だから私はそれがipc://のトランスポートクラス接続であると推測しています。 ZeroMQ zerocopy関数を使用すると、データを繰り返しコピーする時間を節約できます。

通常の転送では、パイプをipcパイプにコピーし、もう一度コピーして、受信側で新しいzmqメッセージにコピーする必要があるzmqメッセージにデータをコピーする必要があります。コピーには4 x 800 = 2.4 GByte/secのメモリ帯域幅が必要です。キャッシュの競合が発生するまでには、一般的なPCシステムの総メモリ帯域幅のかなりのパーセンテージです。ゼロクロコピーを使用するで半分にカットしてください。ゼロコピーへ

オルタナティブ - ゼロ転送

あなたがipc://を使用している場合は、ソケットを介してデータを送信しますが、ソケットを介してデータへの参照を送信しないことを検討してください。

私は、以前zmqとセマフォのブレンドの使用は、それがパターン(私の場合はPUSH/PULL)だ単にため、stl::queueは、データに共有ポインタを運び、まだデータを残すためにzmqを使用して、C++ stl::queueをロックしています。送信者は、キューをロックし、その中に共有ポインタを入れ、次にzmqソケットを通して単純なメッセージ(例えば "1")を送る。受信者は "1"を読み込み、それをキューとして使用してキューをロックし、それから共有ポインタを取り除きます。したがって、データへの共用ポインタは、stl::queueを介してZMQパターン内のあるスレッドから別のスレッドに転送されましたが、データ自体は依然として残りました。私がやったのは、スレッド間でデータの所有権を渡すことだけでした。送信後の共有ポインタが送信直後に範囲外になり、送信者がデータを変更またはアクセスするために使用されない限り、これは機能します。

PUSH/PULLも対処するのが難しくありません。各メッセージは1人の受信者のみに送信されます。 PUB/SUBでそのようなブレンドを行うにはさらに多くの努力が必要であり、受け取ったメッセージはすべての他のユーザーと同じデータブロックへの共有ポインターを持つため、読み取り専用として処理する必要があります。

メッセージサイズ

私はアイデアどのように大きな塊zmqtp転送時には、私はそれがプロトコルの面で比較的効率的だと推測するだろうていませんでした:データの比率。

+0

@ user3666197、ありがとうございました! – bazza

関連する問題