開発やシステム運用段階においてWebシステムの無応答状態が発生した場合、原因となるアプリケーションプログラムを特定するのは難しい。Cosminexus標準搭載のJavaVMには、このような問題を解決するトレース機能が備わっている。
Webシステムにおいて、突然ログインが出来なくなったり、操作中の画面が無反応になって利用者が何も操作ができなくなるが「だんまり」発生することがある。この何も反応のない無応答状態が発生する原因のひとつにJavaアプリケーションプログラムのバグによって、あってはならない無限ループやデッドロックで処理が止まってしまうケースがある。
このようなバグのあるアプリケーションプログラムを特定するには、一般的にはJava VMの内部状態情報であるスレッドダンプを採取することが多いだろう。
しかし、数あるアプリケーションプログラムから犯人を特定するのは非常に煩雑な作業だ。その理由はスレッドダンプがダンプを採取したその瞬間におけるJavaアプリケーションの実行状態を記述したものだからである。
スレッドダンプではマルチスレッドプログラムを実行中の各スレッドのトレースを見ることができるが、このスレッド情報から無応答状態を発生させるような怪しいプログラムを推測するしかない。しかもこの怪しいプログラムをなかなか特定できないケースも多い。なぜならスレッドダンプは、採取された瞬間の断片的な情報であるため、実際に停止しているのかを判断ができないからだ。この問題を解決する方法としては、間隔をあけて複数回のスレッドダンプを採取することが挙げられるが、このタイミングやスレッドダンプの確認方法は、勘や経験に頼るところも多い。
このような問題の解決を支援するため、Cosminexusに標準搭載されているJavaVMではスレッドダンプに以下のような情報を採取できるようにしている。これにより、勘や経験に頼ることなくスピーディにプログラムを特定できる。
(a)スタックトレースのローカル変数情報
スタックのトレースに出力される各メソッドの引数とローカル変数の値を出力する。これによりトレース時点の各メソッドの変数情報の妥当性が検証できるので不正な箇所の特定に有効であり、開発時のデバッグに特に効果的である。
(b)スレッドごとのブロック回数、待ち回数
変数以外の排他処理の妥当性を確認ができるため、デッドロックなどの有無を調べることが可能である。
(c)スレッドごとのCPU消費時間
実際にCPUを使った時間を確認できる。これによりそのスレッドが実際にどのくらい動作していたかが分かる。CPU消費時間が少なければ、例えばI/Oに時間がかかっていたり、OSや他のプロセスの負荷の影響により本当にスレッドが動いていないなど、外部の影響が原因かどうかの判断も可能である。
次回は、メモリリークの原因究明について解説する。
Copyright © ITmedia, Inc. All Rights Reserved.