私のおかげでその他の問題今、LinuxのFIFOを理解しています。つまり、/dev/xconsole
バッファは64KBに制限されます。
この制限を128KBに増やすにはどうすればよいですか?
当然、カーネルを再コンパイルする必要があります。いいですね。しかし、カーネルソースのサイズ制限をどこで変更する必要がありますか?
変更しても安全ですか、それとも他のコンポーネントに副作用がありますか?
3.18カーネルを使用しています。
ベストアンサー1
Linuxカーネル2.6.35以降、fnctl()を使用してパイプサイズを増やすことができますF_SETPIPE_SZ
。権限のないユーザーの値は、0から現在の値までの範囲に制限されますfs.pipe-max-size
sysctl
(デフォルトは1MiB)。
使用する値は64KiBより大きく、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エントリの場合、64KiBの場合は、通常のログエントリよりもはるかに大きいので十分です。
あなたの場合、あなたが経験している問題は、アプリケーションが/dev/xconsole
十分に早く読み取られていないか、十分に早く読み取られていない可能性があります。
それにもかかわらず、グローバルデフォルトパイプサイズを変更しないことをお勧めします。
これは以下を変更することで実現できます。
#define PIPE_DEF_BUFFERS 16
(4KiBページで表現)他のコンテンツでinclude/linux/pipe_fs_i.h
。変更を反映するために他の事項を変更する必要がある場合、または変更が予期しない方法で他の事項に影響を与えることは不可能ではありません。
2の累乗(> = 16)を作成すると問題が発生する可能性が低くなりますが、グローバルシステムのパフォーマンス、特に予約動作に大きな影響を与える可能性があることに注意してください。