chpst は ulimit 設定を尊重しますか?

chpst は ulimit 設定を尊重しますか?

現在、Linux プラットフォーム上の JBoss ベースのサーバーで問題が発生しています。実際には、プロセス内で使用可能なファイル ハンドルが不足し、サーバーが停止します。

10000 個のオープン ファイル ハンドルを許可するように ulimit を設定しましたが、開いているファイル ハンドルの数が大幅に少ないと、サーバーが頻繁にクラッシュします。

私が気づいたことの 1 つは、スタートアップ スクリプトが chpst を使用していて、chpst ではファイル / プロセス / メモリの制限を引数として設定できることです。明示的なコマンドが設定されていない場合、chpst は既存のシステム ulimit を尊重するのか、それとも独自の内部デフォルトを使用するのか、ご存じの方はいらっしゃいますか。もしそうなら、どこで確認できますか。

ありがとう

答え1

chpst は引数として渡されたものを尊重しません。ソース コードは非常に読みにくいですが、strace で確認できます。

execve("/usr/sbin/chpst", ["chpst", "-o", "10000", "/bin/sh", "-c", "sleep 5"], [/* 26 vars */]) = 0
...
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
setrlimit(RLIMIT_NOFILE, {rlim_cur=4*1024, rlim_max=4*1024}) = 0
execve("/bin/sh", ["/bin/sh", "-c", "sleep 5"], [/* 26 vars */]) = 0
...

避けます。

答え2

Olivier Tharan にコメントを追加することはできませんが、これは古い質問ですが、間違った主張を訂正するのは悪いことではないと思います (特に主張が比較的最近のものであれば)。

straceでgetrlimitは最大のハードリミットが4096であると述べ、chpstにソフトリミットを10000に設定するよう要求しています。chpstはそれを実行しますが、limits.conf の管理ソフト リミットは、カーネルとルート ユーザーによって強制されるハード リミットを超えることはできません。これについて言えることは、chpst が警告を出力すべきだということだけです。もちろん、「避けるべき」というわけではありません。

これは、元の問題が chpst ではなく、システムの構成に関連している可能性があることを意味します。 chpst は、単一のプロセスに任意の制限を設定するためのツールであり、カーネルを構成するためのツールではありません。

関連情報