T恤会减慢管道速度吗?

Modified on: Sat, 30 Jun 2018 07:01:30 +0800

我想知道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快得多。pv

无论如何,让我们看看如果我告诉tee写入磁盘上的文件会发生什么。它起步相当快(~800MiB / s),但随着它的继续,它会一直减速 - 最终降低到~100MiB / s,这基本上是磁盘写入带宽的100%。 (快速启动是由于内核缓存了磁盘写入,而磁盘写入速度的降低是内核拒绝让缓存无限增长。)

重要吗?

以上是最糟糕的情况。以上使用管道尽可能快地喷出数据。我能想到的唯一真实世界用途是将原始YUV数据传送到ffmpeg

当您以较慢的速率发送数据时(因为您正在处理它们等),这将是一个不太显着的效果。

作者:derobert

相关问答

添加新评论