Linux-Kernel

增加 FIFO 大小限制

  • December 6, 2016

感謝我的另一個問題的答案,我現在了解 Linux 上的 FIFO,即/dev/xconsole緩衝區限制為 64 KB。

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

顯然,我需要重新編譯我的核心。很好,但是我必須在哪裡更改核心原始碼中的大小限制?

更改它是否安全,或者它會對其他組件產生一些副作用?

我正在使用核心 3.18。

從 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

(這裡將 F_SETPIPE_SZ 硬編碼為其在我的系統上的值,因為特定於 Linux 的fcntl()版本不適用於我的perl.

請注意,這fcntl()不會影響打開/dev/xconsole時已實例化的管道緩衝區/dev/xconsole(由syslog另一端讀取消息的任何應用程序,因此您需要在系統日誌啟動後的每次啟動時執行此操作)。

現在,您是否應該這樣做是另一回事。管道是程序間通信機制。它們不是用來儲存數據的。對於 syslog 條目,64 KiB 應該綽綽有餘,因為它比典型的日誌條目大幾個數量級。

在您的情況下,您更有可能遇到問題,即應用程序讀取的/dev/xconsole啟動不夠早或讀取速度不夠快。

無論如何,我建議不要更改全域預設管道尺寸。

這將通過更改來完成:

#define PIPE_DEF_BUFFERS        16

(以 4 KiB 頁數表示)到include/linux/pipe_fs_i.h. 需要修改其他事物以反映更改或者該更改會以意想不到的方式影響其他事物,這並非不可能。

如果將其設為 >= 16 的 2 的冪,則破壞事物的可能性較小,但請注意,它可能會顯著影響全域系統性能,尤其是調度行為。

引用自:https://unix.stackexchange.com/questions/229529