WordPressメインのサイトで「データベース接続確立エラー」発生しました。
原因は
- apcacheのhttp.conf 設定の手抜き
- 深く考えないままの対処
- mySQLの設定ミス
でした。
apcacheのhttp.conf 設定の手抜き
http.confを引っ越す前のサーバーから持ってきてそのまま使っていました。
ServerLimit と、MaxClients の値を現況に応じて修正していませんでした。
以下はApacheのデフォルトの設定値
<IfModule prefork.c>
StartServers 8 Apacheを立ち上げた際に最初に起動するプロセス数
MinSpareServers 5 常時待機しているようにプロセス数下限
MaxSpareServers 20 常時待機しているようにプロセス数上限
ServerLimit 256
MaxClients 256 起動するプロセスの最大値(ServerLimitが設定可能な上限)
MaxRequestsPerChild 4000 プロセス再起動タイミング 「0」の場合は無制限
</IfModule>
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Apacheに【必要なメインメモリ】のサイズは、
【1つのhttpdが使うメモリ】✕【MaxClientsの設定値】=【必要なメインメモリ】
となります。
【1つのhttpdが使うメモリ】量は、サイトがWordprocessメインの動的サイトだと、40MBから60MBくらいになることもあります。
うちのサイトの状況をTOPコマンドで見ると、1つのhttpdが使うVIRTは450MBくらい、そのうち常駐は約45Mです。
仮に、MaxClientsがデフォルトの256のままだとすると
45MB✕256プロセス=11.5GB
のメインメモリがApache用に必要になります。
非力なVPSが提供するメモリより1桁おおおきいサイズです。
全部のメモリをApacheで使えるわけではありません。
mySQLなど他プロセス用も100Mや200Mのメモリを必要とします。
MaxClients を小さくし過ぎるのも問題
MaxClients を小さくすると、リソースが有るのに、 /var/log/httpd/error_log に
[error] server reached MaxClients setting, consider raising the MaxClients setting
というメッセージを残してApacheが静かになってしまいます。
MaxClients の最適化は難しいです。
深く考えないままの対処
以下のような対処しました。
- httpの監視エラー発生
- WEBアクセスするとレスポンスが返ってこない
- SSHで入る
- メモリー、CPU等問題なし。
- 深夜なのでとりあえず、再起動。
という対処でした。
原因もしらべないまま、とりあえず再起動という手抜き対処でした。
mySQLの設定ミス
mySQLの自動起動設定もれで、mySQL自動起動になっていないまま、システムを再起動したので、mySQL死亡です。
経緯はいかのとおり。
再起動後、WEBアクセスしてみると
データベース接続確立エラー
状況悪化です(T_T)
SSH入って、mySQLをみてみる
$ ps ax | grep sqld
10404 pts/0 S+ 0:00 grep sqld
mySQLが起動していない。
起動する
$ service mysqld start
mysqld を起動中: [OK]
確認してみる
$ ps ax | grep sqld
9944 ? S 0:00 /bin/sh /usr/bin/mys以下省略
存在する。
WEBアクセスしてみる。
WEBも正常状態に無事復活 (^ ^)
メモリもCPUも良好
mySQLの自動起動を確認
$ chkconfig
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mySQLの自動起動が外れている (T_T)
自動起動に修正
$sudo chkconfig mysqld on
$ chkconfig
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
自動起動になった
WEBアクセスするとレスポンス低下の原因調査
アラート発生前後にmessagesにそれらしいログはなし
Apacheのエラーログを見てみる
$ sudo tail -140 /var/log/httpd/error_log
[error] (12)Cannot allocate memory: fork: Unable to fork new process
が出ていいる
メモリ不足
TOPやfreeでもメモリ使用状況確認
メモリもあるし、SWAPもある
Apacheの設定をみる
引っ越し前の設定そのままであったことに気づく。
ServerLimitと、MaxClients を最適化
MaxClients = ServerLimit とする
MaxClients = 使用可能なメモリ量/Apacheの1プロセスが使用するメモリ量
Apacheの1プロセスが使用するメモリ量はTOP コマンドで調べる。
TOPでみると1つほhttpdが使うVIRT(VIRT = SWAP + RES.)は450MBくらい、そのうちメモリに常駐しているサイズ(RES)は約45M。
Apacheが使用可能な実メモリを45Mで割って設定。
http://loadimpact.com/ で負荷テスト
50クライアント同時接続でもSwapされたのは100KB以下であることを確認
CPU負荷は85.8% まで上がる。
メモリ問題なし、CPUはお金がかかるのであきらめる。
転んだついでに
$ sudo yum update
中身を確認しながらupdatesしました。