検索
連載

マルチスレッドによるリソース競合から守るJavaパフォーマンスチューニング(4)(2/2 ページ)

Share
Tweet
LINE
Hatena
前のページへ |       

HPjmeterによるロック競合の解析

 JVMにおけるこうしたスタックトレース解析の欠点は、多数のスレッドを含むJavaアプリケーションでは大量のスタックトレースが生成されてしまうことです。その出力を綿密にチェックしていくのは非常な労力を要します。そこでHPでは、こうした作業を簡素化するためのツール「HPjmeter」(用語解説参照)を提供しています。

 HP-UX対応のJVMである「HP JVM」のバージョン1.3.1以降では、独自の拡張プロファイリング機能を利用可能です。これにより収集されるデータをHPjmeterで解析することで、ロック競合に関する正確な情報が得られます。この拡張プロファイリング機能を利用するには、以下のようにオプションを指定してJVMを起動します。

$ java -Xeprof:file=myfile.eprof <クラス名>

 このとき出力されるファイル(上記例ではmyfile.eprof)をHPjmeterで分析します。HPjmeterはJavaアプリケーションであるため、JVMが動作するあらゆるプラットフォームで動作します。同ツールは、上述の拡張プロファイリング機能による出力ファイルだけでなく、Javaの標準のプロファイリングによる出力ファイルも読み込むことができます。

 HPjmeterは、JVM内で動作するスレッドの状態と生存期間をグラフィカルに表示します。上述の-Xeprofオプションで得られた出力ファイルをロードし、MetricメニューのThread Histogramを選択すると、図4の画面が表示されます。

図4 HPjmeterによるスレッド生存期間の表示
図4 HPjmeterによるスレッド生存期間の表示

 この画面を見れば、すべてのスレッドの生存期間を一度に確認することができます。また、個々のスレッドを表すバーをダブルクリックすることで、それをさらに詳しく分析できます。例えば図4では、スレッド0の詳細を表示し、その存在期間の77.1%がCPUによる実行に充てられていることを確認しています。また、残りの期間は(21.4%)がプロファイリングによるオーバーヘッドであり、実行待ちやロック競合の割合はほとんどないことが分かります。これにより、スレッド0が正常な状態で動作していることが分かります。

 このように、HP JVMとHPjmeterの組み合わせを用いることで、Javaアプリケーションのスローダウンを招くスレッドの問題について、極めて正確な情報を得られます。またHPjmeterは、ほかにも多くの場面で威力を発揮します。例えば、CPUを大量に消費するメソッドを調べたり、その実時間を追跡したりできます。これについては次回以降で紹介する予定です。

スレッド優先度のチューニング

 最後に、スレッドの優先度によるチューニングについて説明します。例えばHP JVMでは、個々のJavaスレッドを「LWP」と呼ばれるHP-UXのカーネル・スレッドに対応付けることで実装しています。このカーネル・スレッドの優先度の初期値は、JVMプロセスの優先度を基に決定されます。そして通常は、CPU時間を消費するに従い、次第にその優先度が低くなっていきます。OSは、スレッドの優先度に基づいてスケジューリングを実施するため、JVM以外のスレッドを優先して実行するようになります。

 そこで、マシン上ではほかに重要なアプリケーションを動作させていない場合は、JVMプロセスに高い優先度を与えることでJavaアプリケーションのパフォーマンスを改善できます。例えばHP-UXの場合、スーパーユーザー権限を用いてniceもしくはreniceコマンドを利用するか、Glance/gpmのrenice機能を利用します。以下は、niceコマンドの使用例です。

# nice --20 java <クラス名> 

 一方、reniceコマンドを利用する際には、「ps -ef」コマンドやGlance/gpmのProcess list画面で得られるJVMのプロセスIDを指定します。プロセスIDが1234であるとすると、以下のように入力します。

# renice -20 1234

 なお、niceとreniceにおいて指定するオプション「--20」と「-20」は、それぞれハイフンの数が異なることに注意してください。

 以上のコマンドを利用することで、JVMプロセス内のすべてのスレッドの優先度が上昇します。同一マシン上のほかのプロセスの優先度は相対的に低くなり、Javaアプリケーションにより多くのCPU時間が割り当てられることになります。もっとも、この方法には、JVM以外のプロセスの性能が低くなるというトレードオフがあり、すべての環境に適用できるとは限りません。

 以上、今回は、マルチスレッドの挙動に着目したチューニング技法を紹介しました。次回はリソースを消費するメソッド・コールの分析方法を説明する予定です。

用語解説

HPjconfig

HP-UXのカーネル・パラメータをJavaアプリケーションに合わせてチューニングするための無償ツール。適切な最新パッチがカーネルに適用されているかをチェックする機能も備える。詳細情報およびダウンロード方法については、以下のページを参照。

http://www1.jpn.hp.com/products/software/development/java/tool/jconfig/index.html

HPjmeter

JVMのプロファイリング・ツール。メソッドのコール回数や経過時間、コールグラフのツリー表示、生成/残存オブジェクトなどをグラフィカルに表示する。アプリケーション解析に役立つ数多くの情報を提供する。詳細情報は、以下のページを参照。

http://www1.jpn.hp.com/products/software/development/java/tool/jmeter/index.html



本記事は、HP-UX Developer Edgeに掲載された「連載 Javaパフォーマンスチューニング」を株式会社アットマーク・アイティおよび本記事の筆者が独自の判断のもとに加筆・修正したものです。



Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る