データベース接続確立エラー

WordPressメインのサイトで「データベース接続確立エラー」発生しました。

原因は

  1. apcacheのhttp.conf 設定の手抜き
  2. 深く考えないままの対処
  3. 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 の最適化は難しいです。


深く考えないままの対処

以下のような対処しました。

 

  1. httpの監視エラー発生
  2. WEBアクセスするとレスポンスが返ってこない
  3. SSHで入る
  4. メモリー、CPU等問題なし。
  5. 深夜なのでとりあえず、再起動。

という対処でした。
原因もしらべないまま、とりあえず再起動という手抜き対処でした。

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しました。