Pipe

三通會減慢管道速度嗎?

  • December 6, 2019

我想知道 tee 是否會減慢管道速度。畢竟,將數據寫入磁碟比通過管道傳輸數據要慢。

tee 是否等待將數據發送到下一個管道,直到它被寫入磁碟?(如果不是,我猜 tee 必須將已發送但未寫入磁碟的數據排隊,這對我來說聽起來不太可能。)

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

是的,它會減慢速度。它基本上確實有一個未寫入數據的隊列,儘管它實際上是由核心維護的——所有程序都有這個,除非它們明確要求。

例如,這是一個使用 的簡單管道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%            

所以,這有點慢,甚至什麼也沒做!這是 tee 在內部將 STDIN 複製到 STDOUT 的成本。(有趣的是,pv在那裡增加一秒保持在 5.19GiB/s,因此pvtee. pvuses快得多splice(2)tee可能不會。)

無論如何,讓我們看看如果我告訴tee寫入磁碟上的文件會發生什麼。它開始時相當快(~800MiB/s),但隨著它的繼續,它不斷變慢——最終降至~100MiB/s,這基本上是磁碟寫入頻寬的 100%。(啟動快是因為核心記憶體了磁碟寫入,而磁碟寫入速度變慢是核心拒絕讓記憶體無限增長。)

有關係嗎?

以上是最壞的情況。以上使用管道盡可能快地噴出數據。我能想到的唯一實際用途是將原始 YUV 數據傳輸到/從ffmpeg.

當您以較慢的速率發送數據時(因為您正在處理它們等),它的影響將不那麼顯著。

引用自:https://unix.stackexchange.com/questions/196432