感谢我的其他问题,我现在明白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/xconsole
syslog
现在,这是否是你应该做的事情是另一回事。管道是进程间通信机制。他们不是故意的店铺数据。对于系统日志条目,64 KiB 应该绰绰有余,因为它比典型的日志条目大几个数量级。
在您的情况下,您遇到的问题很可能是应用程序读取的/dev/xconsole
时间不够早或读取速度不够快。
无论如何,我建议不要更改全局默认管道大小。
这可以通过改变来完成:
#define PIPE_DEF_BUFFERS 16
(以 4 KiB 页数表示)到其他内容include/linux/pipe_fs_i.h
。需要修改其他事物以反映变化,或者该变化会以意想不到的方式影响其他事物,这并非不可能。
如果将其设为 2 的幂(>= 16),则破坏事物的可能性较小,但请注意,它可能会显着影响全局系统性能,尤其是调度行为。