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制限を設定する方法です。
同じ問題がありました。たとえ ulimit -Sn
は私の新しい制限を示し、supervisorctl restart all
およびcat
procファイルの新しい制限は表示されませんでした。
問題は、supervisord
に元の制限があることです。したがって、作成する子プロセスには元の制限があります。
そのため、解決策はsupervisord
を強制終了して再起動することです。
ファイル内のすべてのユーザーに制限を設定することにより、この問題を修正しました。
$ 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
。
注意:ユーザー固有の制限を設定することは、すべての場合に進む方法です。グローバル(*)制限の設定は避けてください。私の場合、それは隔離された環境であり、実験からファイル制限の問題を排除するために必要でした。
これが誰かの髪を救うことを願っています-チャンクごとに髪を引き出すのに時間がかかりすぎたので!
/ etc/sysctl.confを編集して、制限をグローバルに調整してみてください。例:
制限を100000ファイルに強制します。
vi /etc/sysctl.conf
追加:
fs.file-max = 100000
ファイルを保存して閉じます。変更を有効にするか、次のコマンドを入力するには、ユーザーはログアウトしてから再度ログインする必要があります。
sysctl -p
疲れたグーパーに: スーパバイザ設定 でminfds
設定を探しているかもしれません。この設定は、スーパーバイザープロセスと子プロセスの両方で有効になるようです。実際のプログラムを実行する前に制限を設定するシェルスクリプトを起動するなど、他の多くの戦略がありましたが、これが唯一の機能でした。
制限を見つけるには:
cat /proc/sys/fs/file-max
またはsysctl -a | grep file
/ proc/sys/fs/file-maxファイルで変更するか、次を使用して変更します。
sysctl -w fs.file-max=100000
luqmaanの答えは、小さな警告を除いて、私にとっては切符でした。*
ワイルドカードはUbuntuのルートには適用されません(limits.conf
のコメント)。
supervisord
がrootユーザーとして開始された場合、rootの制限を明示的に設定する必要があります。
vi /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
この方法でサービスの制限を設定できますか:
追加:LimitNOFILE=65536
in:/etc/systemd/system/{NameofService}.service