我正在开发一些东西,其中包括一个我制作的生成输出的程序和一个我没有制作的程序(并且非常希望不必更改它)消耗它。我正在使用使用创建的命名 FIFO mkpipe
。我怀疑由于 Linux FIFO 缓冲区较小而存在性能瓶颈。 (并且在不修补内核的情况下无法更改此大小。)
是否有一种类似 FIFO 的替代方案可以与几十兆字节的缓冲区一起使用?非我制作的程序可以从任何可以具有文件系统名称的东西中读取 -/dev/stdin
命名管道(就像现在所做的那样),真实文件,/dev/any-character-device
...
如果没有其他可用的替代方案,甚至第三方免费内核模块也可以做到。
答案1
如图所示,命名管道吞吐量不存在问题,因此如果您的编写器比您的读取器更快,并且两者都以恒定速率工作,那么无论缓冲区大小如何,您的整个任务都将与您的读取器一样慢。
但是,如果您的编写器突发地生成输出,并且输出之间有暂停,那么更大的缓冲区是一个优势。
有一个实用程序 ( buffer(1)
) 用于写入磁带,它可以缓冲输入并使其以恒定速率(默认情况下尽可能快)传输。
your-producer | buffer > fifo & your-consumer fifo
它位于 Debian 软件包中buffer
,或者直接从这里。
答案2
您可以使用 unix 域套接字并使用 来配置缓冲区大小setsockopt()
。