增加 FIFO 大小限制

增加 FIFO 大小限制

感谢我的其他问题,我现在明白Linux上的FIFO,即/dev/xconsole缓冲区限制为64 KB。

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

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

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

我使用的是 3.18 内核。

答案1

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

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

所以你可以这样做:

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

(此处 F_SETPIPE_SZ 被硬编码为其在我的系统上的值,因为 Linux 特定的值fcntl()不适用于我的版本perl)。

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

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

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

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

这可以通过改变来完成:

#define PIPE_DEF_BUFFERS        16

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

如果将其设为 2 的幂(>= 16),则破坏事物的可能性较小,但请注意,它可能会显着影响全局系统性能,尤其是调度行为。

相关内容