cPanel WHM (24)Too many open files でApacheが再起動できないエラー

too many files 画像
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あった時には「多すぎだぞ、バカたれ」と普通に怒られました。