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


27

それは変更することは可能です-ソフトハードリミット特定のプロセスを?

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

ulimit -n <my new value>

私の現在の考え:

  • 変更するプロセスの制限をコマンドはどのように知るのですか?これはシステム全体のオープンファイル制限を変更しませんか?
  • このコマンドはソフト制限のみを変更すると推測しています。それで、ハード制限を増やす方法はありますか?

この貴重な情報を読んだことがありますか? docs.mongodb.org/manual/reference/ulimit
ティンク

はい、私はそれをすべて暗記しました。何かが欠けているかどうかはわかりませんが、そのページは詳細を表示する方法を示しているだけです。ulimit -n <値> ...と書くだけです
テスト

回答:


29

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

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

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

システムのオープンファイル制限を変更するには、すべてのプロセスのオープンファイル記述子制限の合計に近いように見えるため/etc/sysctl.conf、modify およびrun などの操作を行う必要がありますsysctl -p。のfs.file-maxパラメータの値を見てください/etc/sysctl.conf


なんて素晴らしい説明でしょう!どうもありがとうございました。これをすぐに試してみます!
テスト

この答えは私を大いに助けましたが、問題は現在、ハード制限が2048であるということであり、これは私の場合では十分ではありません。1)カーネルが許可する制限を見つけるにはどうすればよいですか?2)ハード制限を今すぐ変更することはできますか?再度、感謝します!
テスト

@test-ハード制限を引き上げたことはありません。これを見つけた:blog.samat.org/2011/04/05/… そして、このwiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux彼らは同じことを言っています。
ブルースエディガー

18

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

prlimit --pid 12345 --nofile=1024:1024

内部で行うことはを呼び出すことsetrlimit(2)です。prlimitのマニュアルページには、有用な呼び出し例が含まれている必要があります。

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


これは私の一日を救った、ありがとう。too many files openエラーを生成していたPythonプロセスが長時間実行されていました。あなたの答えは、プロセスを停止することなく私の問題を解決しました。
Visionscaper

1

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

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がアップグレードされると初期化スクリプトが更新されるため、初期化スクリプト自体を編集する代わりにこれを行うことで管理が容易になりましたが、sysconfigファイルはデフォルトから変更されていない場合にのみ更新されます。


最良かつ最も実用的なソリューション。
ネラアロ

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.