広告 Linux

サーバー障害発生時の切り分け

スムーズに障害から復旧するために、

  1. 障害別の要因予想
  2. 障害別の対策
  3. 障害切り分け時に考慮する点

をまとめます。

障害別の要因予想

Pingで応答がない

サーバ自体が動いていない

  1. HDD不調→自動で再起動→壊れているから起動不可 or fsckするかの入力待ち
  2. 電源がお亡くなりになった
  3. その他ハードウェアの不具合
  4. 負荷に耐えられずフリーズしている(例:メモリ不足)

ネットワークが死んでいる

  1. ネットワークの上流でハードウェアの不具合が出ている

Pingは応答するが、SSHで接続できない

SSHするほど余力がない

  1. メモリ不足やディスクIOの低下

SSHで接続できる

データの書き込みができなくなった

  1. ディスクがいっぱい
  2. ログファイルや一時ファイルがファイルシステム(またはミドルウェア)のデータサイズ制限を越えた

サーバ自体ではなく、各ミドルウェアの問題

  1. ミドルウェアがなぜか停止している
  2. ミドルウェアの設定上限を超えた処理要求が来ている

障害別の対策

サーバ自体が動いていない

とりあえずリブートしてみる

  1. 電源OFF/ONを検討

リブートしても状態がよくならない

  1. fsck(ディスクチェック)の入力待ち状態のときは、とりあえずfsckしてみる
  2. 起動しない場合は電源やその他ハードウェアが死んでいる

ネットワークが死んでいる

【同じネットワーク内のサーバで同様の症状が発生していないか】

  1. tracertで途中経路の疎通を確認
  2. 他のサーバへのPing疎通確認

SSHするほど余力がない

とりあえずリブートさせる

  1. SSHで何度か接続を試みる
  2. 駄目なら電源OFF/ON依頼を検討
  3. 再起動後にログを確認してみる→原因特定へ

データの書き込みができなくなった

HDDの空き容量は十分か?

  1. dfコマンドで空き容量を確認する
  2. ディスク使用率が100%となっていれば不要ファイルを削除

ログファイルなどが書き込み不可になっていないか

  1. サービスが停止しているミドルウェアのログファイルなどで、2GBに達しているファイルがないか確認

各ミドルウェアで問題が発生した

停止していないか確認してみる

  1. Listenしているかどうか見てみる(netstat -npl | grep [サービス名])
  2. service [サービス名] restart とか

エラーの原因を探ってみる

  1. ログファイルでエラー原因を特定する

メモリやリソースが不足したときの挙動

メモリが不足するタイミング
  • CGIやPHPなどによりメモリリークしている
  • 突然大量の接続が確立された などなど

OOM Killerによるプロセス強制停止

メモリの空きがなくなった場合に、適当にプロセスをブッKillして空きメモリを確保しようとします。

下記のようなエラーがsyslogに出てたらOOM Killerさんが働いた証拠。

/var/log/messageskernel: Out of Memory: Killed process xxx(app)

メモリの空き容量が足りなくなったときに、適当なアプリケーションを強制停止させて空きメモリを確保する Linux Kernel の機能です。

ヒューリスティック*に基づいて停止するアプリケーションを決定するため、時に無実の(重要な)アプリケーションを停止させることもあります。

※ヒューリスティック:必ずしもそれが正しいわけではないが、ある程度正解に近い解を得る手法

ということで、何らかの外的要因でメモリ使用量が増えると、勝手にプロセスをKillされてしまう可能性があります。

それによりサービスが停止して障害となる、という一連の流れが出来上がることもある模様。

改善策はメモリ(物理メモリなり、Swapなり)を増やすこと、各サービスのメモリ使用量を減らすこと。

また、OOM Killerそのものを無効化したり、重要なプロセスについてはOOM Killerの対象外とするなど。

メモリ不足によるフリーズ

これは再起動するほかなし。

リソース(接続数)不足による障害

ApacheやSQLのMaxConnections?に達したとき、サーバ監視プログラムが新規接続を確立できずエラーを吐く

Mumin やら Zabbix やらを使っている場合、確認してみると、ものすごい勢いで接続が...

落ち着くのを待つしかないかも。。。

原因の特定

OOM Killerが原因なら、/var/log/messagesに上述のメッセージが出ているはず

再起動後、freeコマンドやpsコマンドでメモリ使用量を見てみるといいかも

障害切り分け時に考慮する点

設定については考慮しない

これまで正常に動作していたなら、突然設定がおかしくなることはありえない

例:ファイルのアクセス権、ネットワーク設定など

むやみやたらと再起動すると痛い目にあうかも

立ち上がるべきサービスが自動で立ち上がらないとか

Sponsor Link

-Linux