質問
⚠️ この事例は公開されてから1年以上経過しています。 情報が古い可能性がありますので、ご注意ください。
🕓 事例公開日 : 2024-12-03
【背景】
検証環境システムで結合テストを実施中に、システムへのアクセスが不可能になった。運用管理サイトから再起動を実行したが、「システムステータス:サーバ起動停止中」の状態で停止処理から進まない状況が発生した。1. 事象
エラーメッセージ・スタックトレース:
[ERROR] j.c.i.s.c.j.CalendarInfoManagerObject - [E.IWP.CALENDAR.20027] 休日判定に失敗しました。jp.co.intra_mart.foundation.calendar.CalendarException: [E.IWP.CALENDAR.00004] Calendar が存在しません。 calendarID = cal_testat jp.co.intra_mart.foundation.calendar.CalendarInfoManagerImpl.isHoliday(CalendarInfoManagerImpl.java:988)at jp.co.intra_mart.foundation.calendar.CalendarInfoManager.isHoliday(CalendarInfoManager.java:536)at jp.co.intra_mart.system.calendar.javascript.CalendarInfoManagerObject.isHoliday(CalendarInfoManagerObject.java:702)...(以下同エラーのループ)
症状の説明:
・検証環境システムにアクセスできない・運用管理サイトから再起動を実行しても「停止処理」で止まる
・AP02サーバへのSSH接続が不安定または不可能
・システムステータスが「サーバ起動停止中」から変わらない
2. 発生条件
・9月20日14:51頃から事象が開始・結合テスト実行中の検証環境
・AP02サーバでカレンダー処理を含むジョブが実行されている環境
・ログ同期処理(rsync)が定期実行されている環境
回答
1. 原因
技術的な原因:
カスタム実装されたカレンダー処理において、存在しないカレンダーID「cal_test」を参照する無限ループが発生し、大量のエラーログが出力されました。これによりメモリ不足とログ同期処理の多重起動が発生し、システム全体が応答不能状態になりました。技術的要因の分析:
・カレンダー処理の無限ループ → 292万件のexceptionログと7.16GBのJVMログが生成・大量ログファイルの生成 → ログ同期処理(rsync)の処理時間が5分を超過
・rsync処理時間の超過 → 5分間隔のcronによる多重起動が発生
多重起動されたrsyncプロセス:PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND15630 root 20 0 193372 20840 0 S 0.0 0.3 0:08.21 rsync11914 root 20 0 173156 20492 0 S 0.0 0.3 0:04.92 rsync14526 root 20 0 198344 20424 0 D 0.0 0.3 1:11.43 rsync...(多数のrsyncプロセスが実行中)・rsyncプロセスの多重起動 → メモリ使用率がスワップ領域含めて100%に到達
メモリ使用状況:KiB Mem : 99.8/7851760 [100%使用]KiB Swap:100.0/8388604 [100%使用]・メモリ不足状態 → SSH接続の不安定化とサーバ再起動処理の異常停止
根本的な要因:
存在しないカレンダーID「cal_test」を参照するカスタム処理が実装されており、エラーハンドリングが適切に行われていないため無限ループが発生したことが根本原因です。2. 対応方法
根本解決方法:
1. 9月19日以前のバックアップからリストアを実行2. カスタム実装のカレンダー処理を見直し、存在しないカレンダーIDへの適切なエラーハンドリングを追加
3. 無限ループを防ぐためのリトライ制限やタイムアウト処理を実装
3. 原因究明に至るまでの調査方法
1. 運用管理サイトでサーバ起動停止実行履歴の詳細を確認2. storageサーバに同期されているAP02のresinのJVMログを分析
3. SSH接続可能なタイミングでAP02サーバ内のリソース使用状況を調査
4. topコマンドでメモリ使用率とプロセス状況を確認
5. アプリケーションログディレクトリ内のexceptionログ件数をカウント
6. resinのJVMログファイルサイズと出力期間を確認
7. エラーログの内容を分析し、カレンダー処理の無限ループを特定
8. rsyncプロセスの多重起動とメモリ消費の因果関係を確認