最近、本番環境でおかしな現象が発生していたので、書き記します。
対策して今の所、再起動は発生しなくなりましたが、ちょっと納得出来ない感じです。一つの例として、参考になればと思います。
EC2が勝手に再起動をする
2021年5月になってから、どうにも再起動をします。本番サーバがバンバン勝手に再起動します。1日2回~3回くらい。最も酷いときは1日に10回以上、30分~1時間おきに勝手に再起動していました。
2021年3月くらいに構築したサーバで、2021年4月末くらいまでは調子が良かったです。インスタンスはt2.medium。リージョンは東京です。
夜中は再起動は発生しませんでした。
なんだこれ。。。というのを対応しました。
現状を確認する
OSとソフトウェアの状況
OSはAmazon Linux2の最新のやつです。2021年3月くらいにyum updateで最新の状態にしています。2021年4月末くらいまでは、勝手に再起動は一切発生していません。3月以降にupdateはしていません。
特に変なソフトウェアは使っていないサーバになります。nginx、php-fpm、mariadbをインストールしています。また、yumでのみソフトウェアをインストールしており、野良パッケージは一切使っていません。
乗っかっているシステムも内容もwordpressとcakephpのアプリケーションで、特殊な実装は一切していない状態でした。
という感じで、OSやシステム的に特殊な状況ではないと言い切れる感じです。余計なソフトウェアも入っていません。
ログを確認する
こういうときは/var/log/messagesを確認します。どうもログを見ると、「電源をぶち抜いた」または「Kernel Panic」のときみたいな落ち方をしています。
普通の再起動のログ
/var/log/messagesに以下のような感じのログが出ます。明らかに「止めましたー。」というログが出てきます
日時 XXXXXXXX systemd: Starting Shutdown.
日時 XXXXXXXX systemd: Reached target Final Step.
日時 XXXXXXXX systemd: Starting Final Step.
日時 XXXXXXXX systemd: Starting Reboot...
日時 XXXXXXXX systemd: Stopping Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling...
日時 XXXXXXXX systemd: Shutting down.
異常な時のログ
上記の様なログが全くなく、通常のdhclientのログしか無いです。その後でいきなり起動ログが追記されています。変なログは全く出ていません。
日時 XXXXXXXX dhclient[2883]: XMT: Solicit on eth0, interval 115480ms.
日時 XXXXXXXX dhclient[2883]: XMT: Solicit on eth0, interval 123730ms.
日時 XXXXXXXX dhclient[2883]: XMT: Solicit on eth0, interval 119440ms.
mariadbのログには、異常終了した時のリカバリーメッセージが残っていました。このことからも、正常な終了はしていません。
また、他のログにも変なログは見当たりませんでした。
他のログから要因を考える
CPU利用率
全く利用されていない状態でした。CPU利用率はずーっと5%未満を維持していました。ロードアベレージが上がりまくっている様子もなく、プロセス数が多すぎる状況でもない。
要するに、あまりアクセスの無い状態です。nginxのログを見ても、異常なアクセスはなし。エラーログもほとんどなし。
CPUのクレジットも使い切っている様子もありません。CPUクレジット使い切ると遅くなって死ぬこともありますが、そういう症状もなしです。
正常です。
メモリの使用率
メモリも40%以上空きがある、普通の状態です。何度も落ちていますが、メモリ不足に陥ってOOMKillerが働いた。という状態はログにも出力されていないし、数値的にも発生し得ない感じです。
CloudWatchの【ステータスチェックの失敗 (システム) 】も特になし
StatusCheckFailed_Systemにも検知はなし。ただ、落ちたときにインスタンスのチェック異常「StatusCheckFailed_Instance」は検知しています。ただ、これは再起動している直前に止まっているからっぽいです。
参考は以下です。
CloudWatchの異常時の再起動設定もしていない
異常検知の時の再起動設定もしていないです。AutoScaleなどの設定もしていないので、この辺も原因から除外されます。じゃぁ、なんで再起動するんだろう。。。
AWSのメンテナンスイベントもなし
特になしです。
誰かがログインして再起動した?
secureやらCloudTrailでも再起動の形跡なし。
たぶん原因(想像)
なんで再起動するのか考えた
たぶん、カーネルパニックを起こしたときに、自動で再起動する設定で再起動を行っているものと思われます。
/etc/sysctl.d/00-defaults.confに以下が書いてありました。
# Wait 30 seconds and then reboot
kernel.panic = 30
カーネルパニック起こして30秒で再起動します。たぶんこの設定で再起動しています。
調査した結果、カーネルパニックっぽいが原因は不明
現象としては、
カーネルパニック→30秒止まったら再起動
という状態だと推測しました。状況的にも、症状的にもこれだと思います。
ただ、なぜカーネルパニックが起こっているのかがわからないです。もう、調査するにはdumpとって追っていくしか無いのか。。。それは嫌なので、まずはできるところから対応してみました。
試したこと(ダメだったこと)
yum updateで最新へ
カーネルパニック起こしているという予想なので、まずはソフトウェアの更新です。kernelやglibc、PHPなど最新のバージョンに全部更新し直しました。何かがSegmentation Faultとか起こして死んでいるのかも。。
→ 結果、ダメでした。勝手に再起動しました
メモリを利用するPHPモジュールとかを排除
OPCacheなど、影響出そうなやつを一旦無効にしてみました。
→ ダメでした。勝手に再起動は発生しています
swapをONにする
メモリの利用率的にまだまだ余裕はあるので大丈夫だと思いますが、念の為。
→ダメでした。勝手に再起動します
ログ的にも状況は変わりません。突然落ちて、ログに何もでないで再起動です。
一旦解決した対策
インスタンスをt2.mediumからc5.largeに変更
これで一旦収まっています。以下のところで、「t系のCPUバーストのある汎用インスタンスは落ちることがある」という噂があります。
ただ、t2.mediumでもメモリ利用量は全然問題なかったので、よくわからんですね。お金もかかるし、悲しい対応です。
ハードウェア的にハズレ、または壊れかけ。同じホストに収納されている誰かのお行儀が悪い。などAWS側の問題かもしれません。とはいえ、AWSに問い合わせしても渋いので、想像ですね。
サーバは落ちる前提とはいえ、1日に10回以上も勝手に再起動は困ります。冗長化していても、良くないレベルです。
なんだこれは。謎すぎる。一つの例として、参考になればと思います。