ティーはパイプラインを遅くしますか?


10

私はティーがパイプラインを遅くするかどうか疑問に思っています。結局のところ、ディスクへのデータの書き込みは、データをパイプするよりも遅くなります。

Tは、データがディスクに書き込まれるまで、次のパイプにデータを送信して待機しますか?(そうでない場合は、送信されたがディスクに書き込まれていないデータをTがキューに入れなければならないので、私には思えないでしょう。)

$ program1 input.txt | tee intermediate-file.txt | program2 ...

いいえ、その「次のパイプ」は最初に書き込むものですここでも説明されています)。
ManRow

回答:


12

はい、それは物事を遅くします。そして、基本的には書き込まれていないデータのキューがありますが、それは実際にはカーネルによって維持されます。明示的に別の方法で要求しない限り、すべてのプログラムにキューがあります。

たとえば、ここにを使用した簡単なパイプがありpvます。これは転送レートを表示するので便利です。

$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null 
  50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%

さて、teeそこにを追加しましょう。追加のコピーを書くことすらしません。転送するだけです。

$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null 
  50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%            

だから、それはかなり遅く、何もしていませんでした!これは、内部でSTDINをSTDOUTにコピーするTのオーバーヘッドです。(興味深いことに、pvそこに1秒を追加すると5.19GiB / sに留まるためpvtee。をpv使用するよりもかなり高速ですがsplice(2)teeそうではない可能性があります。)

とにかく、teeディスク上のファイルに書き込むように指示するとどうなるか見てみましょう。最初はかなり高速(約800MiB / s)ですが、その後も速度は低下し続け、最終的には約100MiB / sまで低下します。これは基本的にディスク書き込み帯域幅の100%です。(高速起動は、カーネルがディスク書き込みをキャッシュしているためであり、ディスク書き込み速度の低下は、カーネルがキャッシュを無限に大きくすることを拒否しているためです。)

それは重要ですか?

上記は最悪の場合です。上記は、パイプを使用してデータを可能な限り高速に生成します。このように考えることができる唯一の実際の使用法は、生のYUVデータをに/からパイプすることffmpegです。

低速でデータを送信している場合(それらを処理しているためなど)、それほど大きな影響はありません。


いい説明
shubham

5

結局ここで驚くべきことは何もない

> POSIXは言う

説明

ティーユーティリティは、ゼロ以上のファイルにコピーを作成し、標準出力に標準入力をコピーするものとします。ティーユーティリティが出力をバッファリングしてはなりません。

そしてそれ

根拠

バッファリング要件は、ティーがISO C標準の完全にバッファリングされた、またはラインバッファリングされた書き込みの使用を許可されていないことを意味します。これは、ティーが1バイトの読み取りに続いて1バイトの書き込みを行わなければならないという意味ではありません。

だから、「根拠」を説明せずに、teeおそらく読み取り専用になり、最大書き込みが多く、一度にあなたのパイプ・バッファに収まることができるバイトごとに単一の書き込みに出力をフラッシュします。

そして、はい、アプリケーションによっては、これはかなり非効率的な場合があります。そのため、これらのいずれかを単に削除/コメントして
くださいhttps : //github.com/coreutils/coreutils/blob/master/src/tee.c#L208
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L224


責任のあるソースコードへのリンクの+1。それらの部分が本当にこの動作の原因であるので、それらを削除/コメントアウトすると、tee実行が速くなりますか?
ハシム

1
そのように見えます!Teeは、OSによって選択されたバッファリングスキームをオーバーライドします
ManRow
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.