web-dev-qa-db-ja.com

特定のプロセスのulimit(開いているファイル)を変更する

soft-hard limitを変更することは可能ですか? 固有プロセス?

私の場合、私のプロセスはmongodであり、多くのWebリソースが単純に実行するように指示しています。

ulimit -n <my new value>

私の現在の考え:

  • コマンドは、変更するprocessの制限をどのようにして知るのでしょうか?これにより、システム全体のオープンファイルの制限が変更されませんか?
  • このコマンドはソフト制限を変更するだけだと思います。では、ハードリミットを増やす方法もあるのでしょうか。
28
test

プロセスは、setrlimit(2)システムコールを介して制限を変更できます。 _ulimit -n_を実行すると、数値が表示されます。これは、プロセスのオープンファイル記述子(ファイル、ソケット、パイプなどを含む)の現在の制限です。 ulimitコマンドはgetrlimit(2)システムコールを実行して、現在の値を確認しました。

重要なポイントは次のとおりです。プロセスは親プロセスから現在の制限を継承します。したがって、_ulimit -n 64_を実行した場合、シェルの開いているファイル記述子の制限を64に設定します。新しいプロセスがsetrlimit()を適切に呼び出さない限り、シェルが開始するプロセスには同じ制限があります。

_mongodb's_オープンファイル記述子の制限を変更するには、シェルで_ulimit -n 2048_(またはカーネルで許可されている任意の大きな数)を実行します。次に、そのシェルを使用してmongodbを起動します。子プロセスとして、mongodbは開いているファイル記述子の(大きな)制限を継承します。

システムの開いているファイルの制限を変更するには、すべてのプロセスの開いているファイル記述子の制限の合計のように見えるので、_/etc/sysctl.conf_を変更して_sysctl -p_を実行する必要があります。 _fs.file-max_の_/etc/sysctl.conf_パラメータの値を確認します。

29
Bruce Ediger

実行中のプロセスの制限を変更するには、ユーティリティコマンドprlimitを使用できます。

_prlimit --pid 12345 --nofile=1024:1024
_

内部で行うことは、setrlimit(2)を呼び出すことです。 prlimitのmanページには、いくつかの有用な呼び出し例が含まれているはずです。

ソース: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/

22
user7610

少なくともLinuxでは、ほとんどのディストリビューションが認証にpamを使用しているようです。 pamに付属する1つのモジュールはlimitsモジュールです。 README pam_limitsから引用:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

その結果、ユーザーごと、グループごと、およびデフォルトの制限を、ハード制限(ルートがこれを設定し、プロセスがより高い値を要求できない)とソフト制限の両方で設定できます。ソフトリミットは通常、ハードリミットよりも低く設定されており、アプリはハードリミットに達するまで上方に増やすことができます。

あなたのケースでは、プロセスが通常のユーザーとして実行の制限を増やしたい場合、そのユーザーまたはグループの制限を増やすことができます。例として、いくつかのサーバー上にmysql cronジョブがあり、追加のファイルハンドルを開く必要があるため、これを設定します。

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

再起動する必要があるものはありません。そのユーザーにsuすると、新しい制限が有効になることがすぐにわかります。

典型的なRedHat派生システムを使用している場合に実行できるもう1つのことは、必要なulimit呼び出しを/ etc/sysconfig/$ SERVICEスクリプトに挿入することです。例として、Apacheのinitスクリプトの名前は/etc/init.d/httpdで、見つかった場合は/ etc/sysconfig/httpd構成ファイルを読み込みます。これは、rpmのアップグレード時にinitスクリプトが更新されるため、initスクリプト自体を編集する代わりに管理する方が簡単ですが、sysconfigファイルはデフォルトから変更されていない場合にのみ更新されます。

1
Todd Lyons

コマンドは、変更するプロセスの制限をどのようにして知るのですか?これにより、システム全体のオープンファイルの制限が変更されませんか?

このコマンドは、現在のプロセス(シェル)とすべての子プロセス(後でシェルから実行するもの)の制限を変更します。

プロセスはツリーに編成されています。すべてのプロセスには、(それを呼び出した)親があります。プロセス番号1のinitは、それ自体が親であるという点で特別なプロセスです。 htopやtopなどのツールを使用すると、親と子のツリーとして表示されるプロセスを表示できます。

0
user7610