開いているファイルが多すぎます

開いているファイルが多すぎます

Lutris を開いてから LOL クライアントを開くと、この現象が発生します。ゲームはうまく動作しません。いろいろ試しましたが、開くファイルの制限を変更できません。どうすれば修正できますか?

Waiting on children  
Waiting on children  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
esync: write: Bad file descriptor  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
esync: write: Bad file descriptor  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  
eventfd: Too many open files  

私の限界情報もあります

~$ 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) 15106  
max locked memory       (kbytes, -l) 16384  
max memory size         (kbytes, -m) unlimited  
open files                      (-n) 1024  
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) 15106  
virtual memory          (kbytes, -v) unlimited  
file locks                      (-x) unlimited  

答え1

「開いているファイルが多すぎます」というエラー メッセージがログに書き込まれる場合、プロセスで使用可能なすべてのファイル ハンドルが使用されたことを示します (ソケットも含まれます)。

ほとんどの場合、これはアプリケーションの一部によってファイル ハンドルがリークされた結果です。は、 ulimitすべてのプロパティに対してシステム制限を設定できる Unix/Linux コマンドです。この場合、開いているファイルの最大数を大きな数 (例: 1000000) に増やす必要があります。

ulimit -n 1000000

または

sysctl -w fs.file-max=1000000

または変更/etc/security/limits.conf:/etc/sysctl.conf

fs.file-max = 1000000

一定期間にわたって開いているファイルの数が増加しているかどうかを判断するには、lsof定期的に PID に対して開いているファイルを報告するコマンドを発行します。例:

lsof -p [PID] -r [interval in seconds, 1800 for 30 minutes] > lsof.out

これは、次のコマンドにアクセスできない場合に特に便利ですlsof

ls -al /proc/PID/fd

ulimits を設定するためのガイドライン

答え2

走る

less /proc/PID/limits

最大オープンファイルの実際のソフト制限を確認します。ulimits を設定したが、実際の数がまだ低い場合は、プロセスの起動方法を確認してください。たとえば、systemd が ulimits を引き継ぐ場合、プログラムが必要な実行時制限を確実に取得できるように、プロセス レベルでの明示的な設定を使用する必要があります。

答え3

これが起こる理由はいくつか考えられると思います。

  1. システム全体の制限(cat /proc/sys/fs/file-max制限を確認するには実行してください。私の場合は です9223372036854775807
  2. 最大ユーザーインスタンス数 (実行cat /proc/sys/fs/inotify/max_user_instances: 以前は128)
  3. ハードユーザー制限 (実行ulimit -nH: 1048576)
  4. ソフトユーザー制限(実行ulimit -nS:以前は1024

1. システム全体の制限

システム全体のルールは、

fs.file-max = 9223372036854775807

/etc/sysctl.conf。この値は私にとっては問題ではありませんでした。

2. 最大ユーザーインスタンス数

私の場合、この値は低すぎました。修正するには、この行を再度追加または編集してください。/etc/sysctl.conf

fs.inotify.max_user_instances = 1024

3. & 4. ハードま​​たはソフトのユーザー制限

ソフト ユーザー制限も低すぎました。これを修正するには、/etc/security/limits.conf(root として) 開いて次の行を追加します。

<username>             soft    nofile 100000

(<username>ユーザー名に置き換えるか、*すべてのユーザーの場合)

ハード ユーザー制限は、上記の行softを に置き換えることで設定できますhard。もちろん、ハード制限とソフト制限、または異なるユーザーに対して複数のルールを設定することもできます。

物事を実行する

ログアウトして再度ログインするだけで変更が反映されるかもしれませんが、念のためシステムを再起動しました。

関連情報