cPanel WHM でアカウントが大量に設定されているサーバだとToo many open files によりApache が起動しないことがあります。cPanel WHM は定期的にApache を再起動するので、突然サイトが表示されなくなり死にそうになります。忘れたころにこの問題が発生するので対応について。
Too many open files の原因
Too many open files という文字通り、プロセスが開けるファイルの上限に達したたため発生した問題です。Too many open files が発生するということは、Apache のファイルディスクリプタが不足したことにより、Apache が正常に起動できない状態だということです。ファイルディスクリプタとは、プロセスがファイルを扱う時に利用する識別子で、実態はintの整数です。
cPanel WHM でアカウントが大量に設定されていると、利用するプロセス数も多いため、デフォルトのApache ファイルディスクリプタでは足りずにこの問題が発生します。
問題が発生するタイミング
cPanel WHM では、1~2時間に1回の頻度で Apache のgraceful restart が実施されます。/usr/local/apache/logs のerror_log の結果ですが、1時間に1回の頻度で再起動されてます。Apache のファイルディスクリプタが足りないと、Too many open files はこのタイミングで発生します。
[Fri Oct 03 10:06:07 2014] [notice] Graceful restart requested, doing restart [Fri Oct 03 11:12:07 2014] [notice] Graceful restart requested, doing restart [Fri Oct 03 11:54:31 2014] [notice] Graceful restart requested, doing restart [Fri Oct 03 12:15:53 2014] [notice] Graceful restart requested, doing restart [Fri Oct 03 13:21:53 2014] [notice] Graceful restart requested, doing restart [Fri Oct 03 14:03:59 2014] [notice] Graceful restart requested, doing restart
Graceful Restart について
graceful restart だと、Apache の親プロセスは、設定ファイルの再読み込みしてから、リクエストの処理が終わった子プロセスを新しい子プロセスに置き換えていきます。
つまり、子プロセスをkill されず、クライアントとの通信が終わるのを待ってから緩やかなApache の再起動が実行されるので、特にアクセスが多いサイトでは有効です。
graceful restartは
/etc/init.d/httpd graceful
コマンドで実行できます
この辺のことはApacheマニュアルの以下が参考になります。
https://httpd.apache.org/docs/2.2/ja/stopping.html
対処の方法
問題の影響範囲に比べるとかなりあっさりした対処方法ですが、/etc/init.d/httpd にulimit -n 65535 を追加するだけです。/etc/init.d/httpd の先頭に追加します。
# processname: httpd # pidfile: /usr/local/apache/logs/httpd.pid # config: /usr/local/apache/conf/httpd.conf ulimit -n 1024 ulimit -n 4096 ulimit -n 8192 ulimit -n 16384 ulimit -n 65535
ulimit -n 65535 を追加したら
grep 65535 /etc/init.d/httpd
で設定を確認。問題がなかったら、Apache を再起動します。
grep 65535 /etc/rc.d/init.d/httpd
cPanel WHM のアカウント数の上限
xeon クアッドコア・メモリ24GBとかのサーバでも、cPanel WHM に設定するアカウントは7,000くらいまでにした方がよいとおもいます。8,000を超えると色々と問題が発生するな~という印象です。cPanel のサポートの人とやり取りをしていて、アカウントが9,000あった時には「多すぎだぞ、バカたれ」と普通に怒られました。