名前付きパイプがファイルへの書き込みと同じくらい遅いのはなぜですか?


18

一方向のプロセス間通信を効率化できるように、名前付きパイプがどのように機能するかを理解しようとしています。データを循環バッファーにコピーするため、オーバーヘッドが発生することが予想されますが、これはRAMに格納されていると考えられますが、ファイルに書き込むよりもパイプがはるかに高速であると予想しました(RAMはディスクよりも桁違いに高速であるため)。

代わりに、名前付きパイプ(または匿名パイプ)がファイルとほぼ同じ速度であることがわかりました。これは、Ubuntu Linuxを実行している通常のディスクドライブ(ソリッドステートではない)を備えた3 GHzデスクトップ上にあります。Pythonの簡単なテストプログラムを次に示します。

import sys
import time
import random

megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))

while True:
    before = time.time()
    sys.stdout.write(megabyte)
    after = time.time()
    sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))

まっすぐに配管/dev/null

python test.py > /dev/null

メガバイトごとに2.1マイクロ秒(定数)を生成します。

ファイルへのパイピング:

python test.py > /tmp/testout.txt

500マイクロ秒から930マイクロ秒の間でジャンプします(ファイルが大きくなるにつれて、より大きな値がより一般的になります。おそらくディスクスペースを探しているためです)。

次に、名前付きパイプ:

mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe

640マイクロ秒(一定)と名前のないパイプを生成します。

python test.py | cat > /dev/null

また、650マイクロ秒(一定)を生成します。

パイプの速度がファイルの速度に似ている理由を誰もが説明できます/dev/nullか?「RAMベースのバッファではなく、ファイルベースのバッファを介してパイプを実行する」というスイッチがどこかにある可能性がありますが、そのスイッチを変更できますか?それはカーネルオプションかシェル変数でしょうか?

別の解釈:500は単なるパイピングで、930は実際に書き込みを行っているため、ディスク出力が500〜930マイクロ秒の間でジャンプするとします。両方の場合の配管の500〜640は同等です。しかし、その解釈のもとでは、パイピングと実際のディスクへの書き込みとの間に2倍しかないのはなぜですか? RAMディスクについて語るWebサイトでは、RAMディスクはハードディスクよりも50〜200倍高速であると言われています。


1
書くことは/dev/nullどこにも書いている間、かなり安い実際にある-それはファイル、FIFO、パイプまたは何も-それは努力を扱う「ロット」を必要とはるかに高価です。
glglgl 14

回答:


31

ファイルを使用しているときに実際にディスクにアクセスしていないため、パフォーマンス上の利点はありません-データはディスクに向かっていますが、実行スレッドはそこに着くまで待つ必要がないので、実際にディスクにヒットすることによる速度の低下はられません。

ディスク操作が完了するのを待って、どれだけ遅くなるかを確認したい場合は、aを呼び出しsync()てください(Pythonのバージョンを変更する方法、こちらを参照)-あなたのディスクだけで数万マイクロ秒ファイルを書き出すために数回シークします(RAIDコントローラーのような何らかの高速書き込みキャッシュがないと仮定します)。


ブロックデバイスのシーク時間について心配するのをやめるのはいつですか?:)
EEAA 14

5
@EEAAすべてのSSD、常に。

1
sync()そのとおりです。ディスク書き込み時間は平均で74,000マイクロ秒になります。(flush()テストの1つのバリエーションでやっていましたが、それはしませんでした。)それで、メガバイトあたり500〜640マイクロ秒が実際にパイプオーバーヘッドであるという私の解釈は、おかげで理にかなっています。
ジムピバルスキー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.