質問
🕓 事例公開日 : 2025-08-05
【背景】
システム運用中にAPサーバがダウンし、サービスが停止してしまった。CPU使用率やネットワーク受信量が異常に増加し、同時にDBサーバの負荷も上昇していた。ユーザーアクセス数やリクエスト数に異常は見られず、原因の特定が困難な状況となっている。1. 事象
エラーメッセージ・スタックトレース:
[25-07-07 11:33:55.719] {CoordinatorThread[]-3} AlarmClock slow alarm Alarm[alarm[ConnectionPool[jdbc/tenant]]] 19867ms coordinator-delta 26514ms[25-07-07 11:33:55.719] {CoordinatorThread[]-3} AlarmClock slow alarm Alarm[alarm[SessionManager[/example]]] 19866ms coordinator-delta 26514msjava.lang.OutOfMemoryError: Java heap spaceDumping heap to java_pid4139.hprof ...Heap dump file created [4971337899 bytes in 278.584 secs]Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Hector.me.prettyprint.cassandra.connection.CassandraHostRetryService-1"Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "QuartzScheduler_intra-mart-intra-martAPP:xx.xx.xx.xx:5200_MisfireHandler"
症状の説明:
・APサーバのCPU使用率が99.25%まで上昇・ネットワーク受信量が約92MBを記録
・DBサーバの書き込みスループットが約1.3MB/秒を記録
・システム全体が応答不能となり、サービス停止が発生
・約20分後に自動復旧したが、根本原因が不明
2. 発生条件
・発生日時:2025年7月7日 11:41頃・ユーザーアクセス数:24名(通常範囲内)
・リクエスト数:2,488件(通常範囲内)
・DBテーブルの急激な増加は確認されず
・特定の機能や画面での集中的な操作は確認されていない
回答
1. 原因
技術的な原因:
階層検索を行うSQLクエリにおいて、マスタデータの設定不備により無限ループが発生し、OutOfMemoryErrorが引き起こされました。技術的要因の分析:
・マスタデータの不正設定:親コード=自コードという循環参照構造 → 階層検索処理が無限ループに陥る・WITH RECURSIVE文の実行:正常終了条件が満たされない → メモリ使用量が継続的に増加
・ヒープ領域の枯渇:大量のオブジェクト生成と保持 → Java heap spaceのOutOfMemoryError発生
・システムリソースの圧迫:CPU使用率99%到達とネットワーク負荷増大 → APサーバ全体の応答停止
根本的な要因:
設定したマスタデータにおける階層構造の循環参照設定が、WITH RECURSIVE文を使用した階層検索処理で無限ループを引き起こし、システムリソースを枯渇させたことが根本原因です。2. 対応方法
根本解決方法:
1. マスタデータの階層構造を正しい値に修正する2. データ整合性チェック機能を実装し、循環参照を事前検出する
暫定対処方法:
問題のあるマスタデータを一時的に無効化し、正常なデータ構造に置き換えることで事象を回避できます。3. 原因究明に至るまでの調査方法
1. システムメトリクス分析:CPU使用率、ネットワーク受信量、DB書き込みスループットの異常値を時系列で確認2. JVMログ解析:OutOfMemoryErrorとAlarmClock slow alarmメッセージの出力を確認
3. Performance Insights活用:負荷の高いSQLクエリを特定し、WITH RECURSIVE文の実行状況を分析
4. マスタデータ検証:階層構造の整合性チェックにより循環参照を発見
5. 再現テスト実施:別環境で同様の設定を行い、問題の再現性を確認