過去6ヶ月間、私は取り除くことができない問題に直面していました。ランダムに「開いたファイルが多すぎます」/「TCP / IPソケットを開けません(24)」/「getaddrinfo:OK」I私のアプリケーションログに「ファイルを開けません」というエラーが表示されます。
私は次のスタックを実行します:mariadb、postgresql、memcached、redis、およびDockerコンテナ内の複数のノードベースのアプリケーション、Ruby on Rails(ruby 2.5.5、Rails 6)アプリケーション、およびsidekiqを実行するPassengerを持つApache、すべてCentOS 7システムで(3.10.0-1127.el7.x86_64)、6コア、16GB RAM。負荷は平均約10%であり、週勤務の間に小さなピークが現れ、30%を超えることはほとんどありません。
最初は、他のJavaアプリケーションが問題を引き起こすと考え、アプリケーションを閉じた後もしばらくして問題が発生し続けました。
私が何をしても、それをCLIで再現することはできません。これは明らかにシステムに大きな負荷なしでランダムに発生するようです。
サービスが再起動してから1時間後、次の統計が表示されます。
開いたファイルの総数
$ lsof | wc -l
30594
オープンファイル別の親プロセス
$ lsof | awk '{print $1}' | sort | uniq -c | sort -r -n | head
8260 mysqld
4804 node
2728 Passenger
2491 container
2095 postgres
1445 dockerd
1320 processor
817 php-fpm
720 httpd
709 ruby
MariaDB変数:
MariaDB [(none)]> Show global variables like 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+
1 row in set (0.01 sec)
MariaDB [(none)]> Show global status like 'opened_files';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_files | 6151 |
+---------------+-------+
1 row in set (0.00 sec)
sysctl.confの最大オープンファイル数を130kに設定すると、問題が解決すると思われ、少し時間がかかりましたが、後で表示され続けます。
$ sysctl fs.file-nr
fs.file-nr = 3360 0 131070
私はすぐに「ab」テストを実行しましたが、開かれたファイルの数があまり増えませんでした。
$ ab -n 1000 -c 10 http://www.example.com/
9589 mysqld
4804 node
4577 Passenger
3756 httpd
3225 postgres
2491 container
2166 utils.rb:
2080 ruby
1445 dockerd
1364 processor
実際のユーザーはホームページを繰り返し訪問しないので、これは重要ではないかもしれません。
犯人がDockerかもしれないという予感がありますが(データベースをDocker化せずにより忙しいサーバーを実行しました)、データベースをDockerから移動する前に他の可能性を調べるのが非常に痛みを伴うプロセスになるため、調査したいと思います。
いくつかのアドバイスを得ることを願っています。
答え1
これは4096個のinotifyハンドラしかないからです。制限を増やしたところ、問題はなくなりました。
fs.file-max = 131070
fs.inotify.max_user_watches = 65536