web-dev-qa-db-ja.com

「多くのオープンファイル」エラーを回避するために、グローバルnofile制限を設定する方法は?

Websocketサービスがあります。エラーが発生しているのは記憶域です:「開いているファイルが多すぎます」が、システム構成を設定しました:

/etc/security/limits.conf
*               soft    nofile          65000
*               hard    nofile          65000

/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000

ulimit -n
//output 6500

だから、私のシステムはそれが正しいと思うと思う。

私のサービスはスーパーバイザーによって管理されていますが、スーパーバイザーの制限は可能ですか?

スーパーバイザーによるプロセス開始の確認:

cat /proc/815/limits
Max open files            1024                 4096                 files 

プロセスの手動開始を確認します。

cat /proc/900/limits
Max open files            65000                 65000                 files 

その理由は、管理者がサービスを管理するために使用されます。スーパーバイザを再起動して子プロセスを再起動すると、「max open files」は問題ありません(65000)が、システムスーパーバイザを再起動すると自動的に起動します(1024)。

スーパーバイザの起動レベルが高すぎて、スーパーバイザの起動時にシステム構成が機能しない可能性がありますか?

編集:

システム:ubuntu 12.04 64bit

それはスーパーバイザーの問題ではなく、システムの再起動後のすべてのプロセス自動起動はシステム構成(最大オープンファイル数= 1024)を使用しませんが、再起動しても問題ありません。

update

たぶん問題は:

ここでの質問は、必要なすべてのスタートアップスクリプトにnofile制限を設定したくないため、グローバルnofile制限を設定する方法です。

27
leiyonglin

同じ問題がありました。たとえ ulimit -Snは私の新しい制限を示し、supervisorctl restart allおよびcat procファイルの新しい制限は表示されませんでした。

問題は、supervisordに元の制限があることです。したがって、作成する子プロセスには元の制限があります。

そのため、解決策はsupervisordを強制終了して再起動することです。

9
Luqmaan

ファイル内のすべてのユーザーに制限を設定することにより、この問題を修正しました。

$ cat /etc/security/limits.d/custom.conf
* hard nofile 550000
* soft nofile 550000

制限を設定した後、サーバーを再起動します。

非常に重要:/etc/security/limits.d/フォルダには、ユーザー固有の制限が含まれています。私の場合、hadoop 2(cloudera)関連の制限です。これらのユーザー固有の制限はグローバル制限をオーバーライドするため、制限が適用されていない場合は、フォルダー内のユーザー固有の制限を確認してください/etc/security/limits.d/およびファイル/etc/security/limits.conf

注意:ユーザー固有の制限を設定することは、すべての場合に進む方法です。グローバル(*)制限の設定は避けてください。私の場合、それは隔離された環境であり、実験からファイル制限の問題を排除するために必要でした。

これが誰かの髪を救うことを願っています-チャンクごとに髪を引き出すのに時間がかかりすぎたので!

9
OkezieE

/ etc/sysctl.confを編集して、制限をグローバルに調整してみてください。例:

制限を100000ファイルに強制します。

vi /etc/sysctl.conf

追加:

fs.file-max = 100000

ファイルを保存して閉じます。変更を有効にするか、次のコマンドを入力するには、ユーザーはログアウトしてから再度ログインする必要があります。

sysctl -p
5
Giovanni Silva

疲れたグーパーに: スーパバイザ設定minfds設定を探しているかもしれません。この設定は、スーパーバイザープロセスと子プロセスの両方で有効になるようです。実際のプログラムを実行する前に制限を設定するシェルスクリプトを起動するなど、他の多くの戦略がありましたが、これが唯一の機能でした。

5
Dan

制限を見つけるには:

 cat /proc/sys/fs/file-max

またはsysctl -a | grep file

/ proc/sys/fs/file-maxファイルで変更するか、次を使用して変更します。

sysctl -w fs.file-max=100000
3
Dimitrios

luqmaanの答えは、小さな警告を除いて、私にとっては切符でした。*ワイルドカードはUbuntuのルートには適用されません(limits.confのコメント)。

supervisordがrootユーザーとして開始された場合、rootの制限を明示的に設定する必要があります。

vi /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535
2
lextoumbourou

この方法でサービスの制限を設定できますか:

追加:LimitNOFILE=65536 in:/etc/systemd/system/{NameofService}.service

2
Maicon Santana