「新しいソケットを作成できませんでした:開いたファイルが多すぎます」というエラーがたくさん発生し始めたRubyアプリケーションがあり、最近以下のように「etc/security/limits.conf」を更新しました。
root soft nofile 6553600
root hard nofile 6553600
nobody soft nofile 655360
nobody soft nofile 655360
mysql hard nofile 655360
mysql hard nofile 655360
* soft nofile 81920
* hard nofile 65000
* - nofile 102400
fs.file-max = 90000
/etc/sysctl.confでも更新されました。
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 62459
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 10240
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 62459
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit-n
10240
しかし、Rubyプロセスのファイルを開く制限はまだ1024です。
cat /proc/13765/limits (pid of ruby app)
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 62459 62459 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 62459 62459 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
Rubyプロセスは1024を超えるファイルを使用しています。
lsof -p 13765 | wc -l
1070
このRubyプロセス/アプリケーションの「最大オープンファイル」値をどのように増やすことができますか?
答え1
/etc/security/limits.conf
次のように更新しました。
これは次のために発生します。pam_limits.soしたがって、ユーザーログインなど、PAMを通過するすべてのものにのみ適用されます。
修正する
/etc/sysctl.conf
一部の起動スクリプトではこれを読むことができるため、変更は再起動後にのみ適用されます...(systemd-sysctl.service
Debianには従来のスクリプトがあります)/etc/init.d/procps
要点は、これらのファイルのいずれもすぐに読み取られず、ulimitへの変更が実行中のプロセスには適用されないことです。
このRubyプロセス/アプリケーションの「最大オープンファイル」値をどのように増やすことができますか?
開始された原因を見つけ、そこでulimitを変更してプロセスを再起動します。コマンドラインから起動した場合は、シェルの制限を変更して再起動すると機能します。 init/systemd/whatで実行している場合は、正しい設定を見つける必要があります。