はじめに
データベース接続確立エラーでサイトにログインできなくなっていたので、原因を調査した時のことをまとめました。
環境
- AWS EC2(Amazon Linux release 2)
- MariaDB バージョン 10.5.18
- swap領域は作成済み
- WordPress バージョン 6.1.1
※2023年4月17日時点の情報です。
※AWSでswap領域を作成する方法は下記サイト参照
https://repost.aws/ja/knowledge-center/ec2-memory-swap-file
原因を確認
まずはMariaDBの状態を確認します。
$ sudo systemctl status mariadb
停止していたため、再起動しました。
$ sudo systemctl restart mariadb
再起動するとしばらくは正常に機能するのですが、何時間か経つと再び停止します。
次に、ログファイルを確認します。mysqld.log
やmariadb.log
などにはログがなかったため、/var/log/message
で確認すると以下のようなメッセージが・・・
Out of memory: Killed process 12175 (mariadbd)
どうやら、httpdが過剰に発生した結果、OOM Killerが働いてmysqldプロセスを殺されていたようです。
OOM Killerはシステムの停止を防止するための機能です。
メモリが不足した時に、一部のプロセスを強制的に殺して、システム全体が落ちないように調整してくれるのですが、この機能が必要なプロセスを殺してしまった形です。
対策
今回は以下の2点で対策することにします。
- MaxRequestsPerChildの設定
- 停止した場合に自動起動するcronを設定
1のMaxRequestsPerChildは、ざっくりいうとプロセスが処理できるリクエスト数のことです。
MaxRequestsPerChildを設定することでリクエスト数に上限を設けるイメージです。
2は自動で復帰するプロセスの設定です。
mariadbのプロセスが無くなった時に、起動コマンドを実行するプログラムを作成して、cronに実行してもらうように設定します。
プログラムはシェルスクリプトというファイルを作成して記述します。
cronは任意の時間に指定したプログラムを動かしてくれる機能で、作成したシェルスクリプトを毎分実行するように設定することで、mysqldが落ちてもサーバーが生きていれば復帰するよう、常に見張ってもらいます。
MaxRequestsPerChildの設定
では、1つ目の設定から、
現在のプロセスの起動数を確認します。
$ ps aux | grep httpd | grep -v "(root|grep)" | wc -l
変更内容を記載するファイルmpm.conf
を作成します。
$ vi mpm.conf
作成したmpm.conf
に以下の内容を記載します。(数値は全てデフォルト値で大丈夫です)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 256
MaxRequestWorkers 256
MaxConnectionsPerChild 1000
</IfModule>
設定を反映させるためにApacheを再起動するコマンドを実行します。
$ systemctl restart httpd
再度プロセスの起動数を確認して、プロセス数が変わっていたら設定は完了です。
$ ps aux | grep httpd | grep -v "\(root\|grep\)" | wc -l
cronの設定
次に2つ目の設定です。
シェルスクリプトの作成から任意の場所にauto_start.sh
を作成します。
$ vi auto_start.sh
続いて作成したファイルに以下の内容を記載します。
mariadbのプロセス数が0件の場合起動コマンドを実行するという内容です。
#!/bin/sh
n=` ps -ef | grep mariadb | grep -v grep | wc -l`
if [ $n = 0 ]; then
sudo service mysqld start
fi
これでcronに実行させるシェルスクリプトの作成は完成です。
次にcronの設定を編集します。
エディタを起動するコマンドを実行します。
$ crontab -e
cronに実行させる時間と内容を記載します。
* * * * * /bin/sh /cron/auto_start.sh
通常、*部分には日時を表す数字を記述しますが、ここでは全て*を入力して「毎分」で設定します。
後半の/cron/auto_start.sh
ではauto_start.sh
を格納しているパスを指定しています。
以上で自動復帰プロセスの設定も完了しました。
さいごに
今回はここまでです。
根本的な解決ではないものの、データベース接続確立エラーは回避することができました。
また何か進展があれば記事にまとめる予定です。