增加 FIFO 大小限制

Mar*_*ter 8 buffer linux-kernel fifo

感谢我的另一个问题的答案,我现在明白 Linux 上的 FIFO,即/dev/xconsole缓冲区限制为 64 KB。

如何将此限制增加到 128 KB?

显然,我需要重新编译我的内核。没关系,但是我必须在哪里更改内核源代码中的大小限制?

更改它是否安全,或者它是否会对其他组件产生一些副作用?

我正在使用内核 3.18。

Sté*_*las 15

从 Linux 内核 2.6.35 开始,您可以使用F_SETPIPE_SZfnctl()增加管道的大小。非特权用户的值限制在 0 和当前值fs.pipe-max-size sysctl(默认为 1?MiB)之间。

您使用的值应该大于 64?KiB 并且是 2 的幂。

所以你可以这样做:

perl -MFcntl -e 'fcntl(STDIN, 1031, 1048576) or die $!' <> /dev/xconsole
Run Code Online (Sandbox Code Playgroud)

(此处将 F_SETPIPE_SZ 硬编码为它在我系统上的值,因为fcntl()我的perl.

请注意,这fcntl()不会影响/dev/xconsole但在/dev/xconsole打开时已实例化的管道缓冲区(由syslog任何应用程序读取另一端的消息,因此您需要在系统日志启动后的每次启动时执行此操作)。

现在,这是否是你应该做的事情是另一回事。管道是进程间通信机制。它们不是用来存储数据的。对于 syslog 条目,64?KiB 应该绰绰有余,因为它比典型的日志条目大几个数量级。

更可能在您的情况下,您遇到的问题是应用程序的读取时间/dev/xconsole不够早或读取速度不够快。

无论如何,我建议不要更改全局默认管道尺寸。

这将通过更改来完成:

#define PIPE_DEF_BUFFERS        16
Run Code Online (Sandbox Code Playgroud)

(以 4?KiB 页数表示)到include/linux/pipe_fs_i.h. 需要修改其他事物以反映更改或该更改会以意想不到的方式影响其他事物并非不可能。

如果您将其设为大于等于 16 的 2 的幂,则不太可能破坏事物,但要注意它可能会显着影响全局系统性能,尤其是调度行为。

  • @MartinVegter,使用 GNU `dd`,您可以使用 `dd iflag=nonblock if=/dev/xconsole of=/dev/null` 来清空管道。 (3认同)
  • @MartinVegter,回答你关于_how to get the current mount of data_的问题:`perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &amp;FIONREAD, $n) 或 die$!; 打印解包 "L", $n' &lt;&gt; /dev/xconsole` (2认同)