名前付きパイプはソケット IPC よりも高速であると誰もが言うようです。彼らはどれくらい速いですか?ソケットは双方向通信が可能で非常に柔軟であるため、私はソケットを使用することを好みますが、柔軟性よりも速度がかなり大きい場合は速度を選択します。
11 に答える
ソケットからパイプに変更できるように、IPC メカニズムを慎重に分離して、最初に簡単な道をたどることをお勧めしますが、私は間違いなくソケットを最初に使用します。プリエンプティブに最適化する前に、IPC のパフォーマンスに問題があることを確認する必要があります。
また、IPC の速度に問題がある場合は、パイプではなく共有メモリへの切り替えを検討する必要があると思います。
転送速度のテストを行いたい場合は、 socatを試す必要があります。これは、ほぼすべての種類のトンネルを作成できる非常に用途の広いプログラムです。
shodanex に同意します。まだ問題のないものを時期尚早に最適化しようとしているようです。ソケットがボトルネックになることがわかっていない限り、私はソケットを使用します。
名前付きパイプを信頼している多くの人は、(他のすべてがどれだけうまく書かれているかにもよりますが) 少し節約できますが、有益な作業を行うよりも IPC 応答をブロックすることに多くの時間を費やすコードになってしまいます。確かに、ノンブロッキング スキームはこれに役立ちますが、扱いにくい場合があります。古いコードを現代に持ち込むのに何年も費やしましたが、私が見たほとんどの場合、スピードアップはほとんどゼロです。
ソケットがあなたを遅くするだろうと本当に思っているなら、ロックの使い方に細心の注意を払いながら、共有メモリを使って門の外に出てください。繰り返しますが、実際にはわずかなスピードアップが見られるかもしれませんが、相互排他ロックを待っているとその一部が無駄になっていることに注意してください。私はfutex 地獄への旅行を主張するつもりはありません(あなたの経験にもよりますが、2015 年にはもう地獄ではありません) 。
ポンド対ポンドで、ソケットは (ほとんど) モノリシック カーネルの下でユーザー空間の IPC を使用するための最良の方法であり、(通常) デバッグと保守が最も簡単です。
ソケットは必ずしも IP (および TCP または UDP) を意味するわけではないことに注意してください。UNIX ソケット (PF_UNIX) を使用することもできます。これにより、127.0.0.1 への接続よりもパフォーマンスが大幅に向上します。
多くの場合、数字は感覚以上のものを物語っていますが、ここにいくつかのデータがあります: Pipe vs Unix Socket Performance (opendmx.net) .
このベンチマークは、パイプの速度が約 12 ~ 15% 速いという違いを示しています。
速度が必要ない場合は、ソケットが最も簡単な方法です。
あなたが見ているのが速度である場合、最速の解決策は名前付きパイプではなく共有メモリです。
ソケットの問題の 1 つは、バッファをフラッシュする方法がないことです。すべてのデータを収集し、40 ミリ秒後にフラッシュする Nagle アルゴリズムと呼ばれるものがあります。したがって、帯域幅ではなく応答性である場合は、パイプを使用したほうがよいでしょう。
ソケット オプション TCP_NODELAY を使用して Nagle を無効にすることはできますが、読み取り側が 1 回の読み取り呼び出しで 2 つの短いメッセージを受信することはありません。
それでテストして、私はこれのどれもで終わり、多くのカーネルシステムコールを回避して、共有メモリにpthreadミューテックスとセマフォを備えたメモリマップベースのキューを実装しました(しかし、今日はもうそれほど遅くはありません)。
名前付きパイプを使用した双方向通信の場合:
- プロセスが少ない場合は、2 つのパイプを双方向に開くことができます (processA2ProcessB と processB2ProcessA)。
- 多数のプロセスがある場合は、すべてのプロセス (processAin、processAout、processBin、processBout、processCin、processCout など) のパイプの入出力を開くことができます。
- または、いつものようにハイブリッドにすることもできます:)
名前付きパイプは非常に簡単に実装できます。
たとえば、標準的なファイル入出力ベースの通信 (fopen、fprintf、fscanf ...) のおかげで、名前付きパイプを使用して C でプロジェクトを実装しました。
私はそれらをJavaでコーディングしました(オブジェクトをシリアライズして送信していました!)
名前付きパイプには 1 つの欠点があります。
- ファイルシステムに依存しているため、ソケットのように複数のコンピューターにスケーリングしません (共有ファイルシステムがオプションではないと仮定します)。
名前付きパイプとソケットは機能的に同等ではありません。ソケットはより多くの機能を提供します (最初は双方向です)。
どちらがより優れたパフォーマンスを発揮するかはわかりませんが、問題ではないと強く思います.
Unix ドメイン ソケットは、tcp ソケットとほとんど同じことを行いますが、ローカル マシン上でのみ、オーバーヘッドが (おそらく少し) 低くなります。
Unix ソケットの速度が十分でなく、大量のデータを転送している場合は、クライアントとサーバー間で共有メモリを使用することを検討してください (これはセットアップが非常に複雑です)。
Unix と NT にはどちらも「名前付きパイプ」がありますが、機能セットはまったく異なります。
ZeroMQ [ zmq/0mq ]のような軽量ソリューションを使用できます。非常に使いやすく、ソケットよりも劇的に高速です。