有没有办法提高linux管道的性能?
我正在尝试使用64位6将高速数据从一个应用程序传输到另一个应用程序。我使用有没有办法提高linux管道的性能?,linux,performance,pipe,named-pipes,Linux,Performance,Pipe,Named Pipes,我正在尝试使用64位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
完成了以下基准测试,以发现管道阻碍了我,而不是程序中的算法。我的目标是达到大约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
我是否可以对内核或其他任何东西进行任何调整,以提高通过管道运行数据的性能?我也尝试过命名管道,得到了类似的结果 你试过更小的积木吗 当我在自己的工作站上尝试时,我注意到当降低块大小时,不断地改进。 在我的测试中只有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,这是一个相当大的系数 似乎Linux管道一次只能向读卡器输出4096字节,而不管编写器的写入量有多大 因此,每次写入(2)系统调用尝试将4096个字节以上的字节填充到一个已填充的管道中只会导致写入程序暂停,直到读取器可以调用从管道中取出那么多数据所需的多次读取,并执行它想做的任何处理
这告诉我,在多核或多线程CPU上(有人仍然使用单核、单线程、CPU吗?),通过让管道中的每个写入程序一次只写入4096字节,可以获得更多并行性,从而缩短运行的时钟时间,在返回到任何数据处理或生产之前,它可以为制作下一个4096块做任何事情。感谢您解决这个问题!我做了一些额外的后续测试,发现真正重要的是写作速度。在我看来,问题与问题文本和答案都不匹配。我想自己学习实际问题的答案我也有同样的好奇心。。。检查这个问题:4096字节或4kb是大多数系统的默认页面大小。这可能就是这顶帽子的原因。如果您可以增加系统中的页面大小,可能会使管道读取和写入更多数据。