有没有办法提高linux管道的性能?

时间:2012-09-27 16:45:16

标签: linux performance pipe named-pipes

我正在尝试使用64位CentOS 6将极高速数据从一个应用程序传输到另一个应用程序。我使用dd完成了以下基准测试,发现管道阻碍了我而不是程序中的算法。我的目标是达到大约1.5 GB / s的速度。

首先,没有管道:

dd if=/dev/zero of=/dev/null bs=8M count=1000
1000+0 records in
1000+0 records out
8388608000 bytes (8.4 GB) copied, 0.41925 s, 20.0 GB/s

接下来,两个dd进程之间的管道:

dd if=/dev/zero bs=8M count=1000 | dd of=/dev/null bs=8M
1000+0 records in
1000+0 records out
8388608000 bytes (8.4 GB) copied, 9.39205 s, 893 MB/s

我是否可以对内核或其他任何可以改善通过管道运行数据的性能的调整?我也尝试了命名管道,并获得了类似的结果。

2 个答案:

答案 0 :(得分:5)

您是否尝试使用较小的块?

当我尝试使用自己的工作站时,我会注意到在降低块大小时会有所改进。 在我的测试中,它仅在10%的范围内,但仍然是一种改进。你正在寻找100%。

事实证明,进一步测试,非常小的块大小似乎可以解决问题:

我试过

dd if=/dev/zero bs=32k count=256000 | dd of=/dev/null bs=32k
256000+0 records in
256000+0 records out
256000+0 records in
256000+0 records out
8388608000 bytes (8.4 GB) copied8388608000 bytes (8.4 GB) copied, 1.67965 s, 5.0 GB/s
, 1.68052 s, 5.0 GB/s

并使用您原来的

dd if=/dev/zero bs=8M count=1000 | dd of=/dev/null bs=8M
1000+0 records in
1000+0 records out
1000+0 records in
1000+0 records out
8388608000 bytes (8.4 GB) copied8388608000 bytes (8.4 GB) copied, 6.25782 s, 1.3 GB/s
, 6.25203 s, 1.3 GB/s

5.0 / 1.3 = 3.8因此这是一个相当大的因素。

答案 1 :(得分:0)

似乎Linux管道一次只能向读者产生4096个字节,而不管作者的写入量有多大。

因此,每次write(2)系统调用试图将超过4096个字节填充到已填充的管道中,只会导致写入器停顿,直到读取器可以调用将大量数据从管道中拉出所需的多次读取为止,做任何想做的处理。

这告诉我,在多核或多线程CPU上(有人仍在制造单核,单线程,CPU吗?),通过使每个编写器都处于流水线中,可以获得更多的并行度,从而缩短经过的时钟时间只能一次写入4096字节,然后再返回进行下一个4096块的数据处理或生产。