Teeはパイプラインの速度を遅くしますか?

Teeはパイプラインの速度を遅くしますか?

ティーがパイプの速度を遅くしているのだろうか。結局のところ、ディスクにデータを書き込むのはパイプ経由で送信するよりも遅くなります。

データがディスクに書き込まれるまで、次のパイプにデータを送信するのを待ちますか? (そうでなければ、ティーは転送されたがディスクに書き込まれていないデータをキューに入れる必要があるようですが、私の考えではそうではありません。)

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

ベストアンサー1

はい、遅くなります。デフォルトでは記録されていないデータのキューがありますが、実際にはカーネルによって管理されます。明示的に他に要求されない限り、すべてのプログラムにはこのキューがあります。

たとえば、ここで使用されている単純なパイプがあります。pvこれは転送速度を示すために便利です。

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

teeそれでは、追加のコピーを作成せずにここに1つを追加してみましょう。渡すだけです。

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

だからこれは少し遅く、何もしません!これはティーの内部STDINをSTDOUTにコピーするオーバーヘッドです。 (興味深いことに、それに2番目のものを追加すると、それでもpv5.19GiB / sが維持されます。pvteepvsplice(2)tee

teeとにかく、ディスクにあるファイルに書き込むとどうなるか見てみましょう。最初は非常に速く始まりますが(〜800MiB / s)、時間が経つにつれて速度が遅くなり、最終的に約100MiB / sに下がります。これはデフォルトでディスク書き込み帯域幅の100%です。 (クイックスタートはカーネルキャッシュディスクの書き込みによるものですが、遅いディスクの書き込みはカーネルがキャッシュが無限に大きくなるのを拒否するためです)。

それはそんなに重要なのか?

上記のケースは最悪の場合です。上記はパイプを使用してできるだけ早くデータをエクスポートします。私が考えることができる唯一の実際の使用は、生のYUVデータをffmpeg

データを処理するなどの理由で、より遅い速度でデータを送信すると、影響がはるかに少なくなります。

おすすめ記事