大規模化・安定稼働・開発効率化…Webシステム開発・運用を乗り切るテクニック

第4回 トラブルシューティング②

この記事を読むのに必要な時間:およそ 2 分

はじめに

現在のWebシステム開発・運用で踏まえるべき新しい技術的な取り組みについて,日立Cosminexusの製品群を題材として取り上げながら解説する本連載の前回では,トラブルシューティングの前編を解説しました。

第4回の今回は,後編として,Webシステム運用時の主なトラブルを症状別に取り上げながら,トラブルシューティングの流れを説明します。

プロセスハングアップの調査

プロセスハングアップの原因特定に有効な資料としては,PRFトレース(障害解析/性能解析トレース),スレッドダンプ,OSの統計情報が挙げられます図1)。まず該当プロセスのCPU使用率を調べます。100%に近い場合は,無限ループまたは再帰呼び出しに陥っている可能性が高いと見られます。逆に0%に近い場合は,DB(データベース)などのバックプロセスから応答が返ってきていないか,スレッド同士でロックを掛け合うデッドロックの可能性が疑われます。トラブルの原因としてはデッドロックよりも,バックプロセスからの応答がない場合が多く見られます。

図1 プロセスハングアップ時の調査の流れ

図1 プロセスハングアップ時の調査の流れ

CPU使用率を調べたあとは,PRFトレースで問題の個所を探し,詳細をJavaVM上の全スレッドの状態およびスタックトレースを出力するスレッドダンプで特定します。

PRFトレースによる解析

PRFトレースは,ブラウザ操作からアプリケーションサーバ,DBに至るまでのトレースを突き合わせ,ミドルウェアの中の動作を可視化できるCosminexus独自の機能です。トレース出力処理と非同期で動作するためシステムの負荷が小さく,本番環境でも利用できるのが特長です。

PRFトレースでは,リクエストごとにユニークなIDを付与してサーバ内の各処理ポイントでトレースを取得します。さらに,DBのコネクションIDとのマッチングによりWebサーバからDBまでの処理シーケンスを容易に把握できます図2)。出力形式はCSV(Comma Separated Values;カンマ区切り)のため,Excelなど一般的な表計算ソフトで見ることができます。

図2 PRFトレース機能の概要

図2 PRFトレース機能の概要

プロセスハングアップ発生時にPRFトレースの出力を解析すると,リクエストID,日付,時刻(ナノ秒単位)から特定のプロセスで異常に処理時間が長い個所が見つかります。これにより,どの処理でプロセスハングアップが発生しているのかがわかります。

スレッドダンプの解析

プロセスハングアップの発生個所がある程度絞り込めたら,続いてスレッドダンプを解析します。スレッドダンプは2~3秒おきに10回程度実行すると,より正確な解析が可能になります。

複数回取得したスレッドダンプから,tid(スレッドID)が同じスレッドのスタックトレースを比較調査します。

ハングアップ個所がネイティブメソッドの場合は,さらにメモリダンプを解析します。その結果,ハングアップしたモジュールがわかりますので,当該モジュールの開発元に調査を依頼します。

バックプロセス無応答の場合

複数のスレッドダンプで同一tidのスレッド属性が実行可能状態を表すrunnableである場合,長時間にわたって同じ処理を実行中となってないかを調べます。

デッドロックの場合

スレッド属性がロック取得待ちを表すwaiting formonitor entryのスレッドにおいて,ロックを取得待ちのハッシュコードとロックを取得済みのハッシュコードがお互いにロックを掛け合っているスレッドがないかを調べます。

無限ループの場合

複数のスレッドダンプで同一tidのスレッドがすべてrunnableで,同一メソッド内の特定の行が複数回,繰り返し実行している場合は,無限ループが疑われます。

プロセススローダウンの調査

スローダウンとハングアップの現象はよく似ており,スローダウンが長時間になれば,ハングアップと同じ状態と言えます。

そのため,スローダウンの調査方法は,ハングアップと同じ手順で進めます。PRFトレースとスレッドダンプ,必要であればメモリダンプを取得して解析することで,原因モジュールを特定できます。

コメント

コメントの記入