なにがあったのか
平穏であるはずのとある平日の朝、サービスダウンのアラート通知がきました。
特に最近何かのリリースなど行っていなかったので、インフラ的な障害かアタックかを最初疑いました。
調べてみたところDBが負荷が異常に上がっていて、何も処理を受け付けない状態になっていました。
どうしてそうなった
何のプロセスが走っているのかSQLのプロセルを確認したところ・・・、同じ処理が二重に実行されていました。
バッチサーバのプロセスをみると、深夜に動く重たい集計処理が二重に実行されていました。
どうしてこうなった?と思ってcronの設定をみたところ・・・。
デイリーの集計処理の設定に加え、1年前の今日に設定した、「月日時分」で設定した集計処理の設定がありました。
思い起こせば1年前、集計処理の改修を行い、初めて本番で実行する前日に、もしかすると想定以上に処理時間がかかるかもしれないので、元々のデイリーのcron設定をコメントアウトして、次の日のいつもより3時間早い時間に「月日時分」を設定していたのでした。
翌日、元々のデイリーのcron設定のコメントアウトを戻したものの、「月日時分」で設定した部分は消さずにそのままにしていたようです。
そのバッチ処理も排他制御などかかっていなかったので、起動すれば同時に動かせる状態になっていました。
どうすればよかったのか
- cronの設定は定期的に見直しましょう
- できればcronではなく、GUIで管理できるようなタスクスケジューラを入れましょう
- 同時に実行されないよう、バッチ処理には排他制御を入れましょう