2019-04-22に更新

KUSANAGI で MySQL が頻繁に落ちる際の対処

環境

名前 バージョン
VPS さくらインターネット 4GB
OS KUSANAGI 8.4.2-2 (CentOS7 ベース)
ウェブサーバー nginx 1.15.10
PHP PHP 7.3.4
MySQL MariaDB 10.1.38
アプリケーション WordPress
その他 Mackerel

問題発生

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

サイトにブラウザからアクセスすると「データベース接続確立エラー」となる。

状況確認

コンソールにて。

sudo cat /var/log/messages

以下のログを発見。

Apr 14 00:31:06 hoge kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

MySQL が落ちている。

暫定対処

コンソールにて。

sudo systemctl start mysqld

「データベース接続確立エラー」は解消される。

数時間後に問題再発

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

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

再度状況確認

コンソールにて。

sudo cat /var/log/messages

同様のログを確認。

Apr 14 07:48:32 hoge kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

Mackerel でのメモリ状況を確認。

スクリーンショット 2019-04-14 14.08.10.png

メモリを食いつぶした後スワップまで喰って無事死亡している。

nginx ログの確認

詳細は割愛するが、nginx のログを確認したところ、ブルートフォースアタックでの接続数増、pubsubhubbub での接続数増、行儀の悪い bot からの接続数増など様々な痕跡があった。

なお、KUSANAGI による nginx ログは以下の場所に分散している。
(筆者はしばらくの間ログ分散に気付かず、確認に時間がかかった。)

WordPress SSL

/home/kusanagi/kusanagi_html/log/nginx/ssl_access.log

※ kusanagi_html はプロビジョニングディレクトリ

WordPress HTTP

/home/kusanagi/kusanagi_html/log/nginx/access.log

※ kusanagi_html はプロビジョニングディレクトリ

WordPress 外

/var/log/nginx/access.log

恒久対処

コンソールにて。

sudo vim /etc/php-fpm.d/www.conf
/pm.max_children = 
i

PHP-FPM の設定を変更する。

pm.max_children = 50

を以下に変更。

pm.max_children = 17

[esc] キーで編集終了。

KUSANAGI (nginx + php-fpm) 再起動

sudo kusanagi restart

対処後の確認

Mackerel でのメモリ状況

スクリーンショット 2019-04-14 14.06.51.png

ピーク時のメモリ消費量が 3.5GB 程度と、上限の 4GB から 0.5GB 程度余裕のある状態で消費しきらずに、スワップアウトも発生しない。

結果、「データベース接続確立エラー」とならず接続状況は安定している。

解説

PHP-FPM の pm.max_children はアプリケーションの最大プロセス数。php.ini ファイルでの memory_limit128M に設定されているため、pm.max_children17 に設定した場合 PHP-FPM のみで食いつぶすメモリ量を 2GB 程度に抑えることができる。
デフォルトで 1GB 程度消費しているため、計約3GB。さらに MySQL などで 0.5GB 程度消費しているものと思われる。
詳細は top コマンド等で確認できる。

今後

万が一落ちた場合に monit で MySQL の自動再起動、fail2ban によるブロッキング設定を行いたいが後ほど。

参考

ツイッターでシェア
みんなに共有、忘れないようにメモ

sola

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント