Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  Javaパフォーマンス・チューニング

Javaパフォーマンス・チューニング

第4回:マルチスレッドによるリソース競合

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
Javaパフォーマンス・チューニング:第3回 Javaパフォーマンス・チューニング:第3回
Javaパフォーマンス・チューニング 第4回
マルチスレッド利用の注意点
HPjmeterによるロック競合の解析
ページ:  戻る   |   1   2

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


HP JVMのバージョン1.3.1以降では、同JVM独自の拡張プロファイリング機能を利用できます。同機能によって収集されるデータを、HPが無償で提供するプロファイリング・ツールHPjmeterで解析することで、ロック競合に関する正確な情報が得られます。

拡張プロファイリング機能を利用するには、以下のようにオプションを指定してJVMを起動します。

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

これにより出力されるファイル(上記例ではmyfile.eprof)を分析するためのツールが、HPjmeterです。同ツールは、以下のWebサイトよりダウンロード可能です

HPjmeter

$ java -Xmn120m -Xmx480m -Xms480m -XX:SurvivorRatio=8 <クラス名>

HPjmeterはJavaアプリケーションであるため、JVMが動作するあらゆるプラットフォームで動作します。同ツールは、上述の拡張プロファイリング機能による出力ファイルだけでなく、Javaの標準のプロファイリングによる出力ファイルも読み込むことができます。ちなみにHPjmeterは、スレッド挙動の解析だけでなく、その他の数多くの解析機能を備えています。これらについて詳しくは、上記Webサイトのチュートリアルを参照してください。

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アプリケーションのパフォーマンスを改善できます。具体的には、スーパーユーザー権限を用いて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以外のプロセスの性能が低くなるというトレードオフがあり、全ての環境に適用できるとは限りません。

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


連載記事一覧 戻る ページ:  戻る   |   1   2

連載 「Javaパフォーマンス・チューニング」記事一覧

第1回:基本的ルール、パフォーマンス・ツールの使い方
第2回:ガベージ・コレクション
第3回:ヒープ・メモリ管理
第4回:マルチスレッドによるリソース競合
第5回:メモリ・リークの発見
第6回:メモリ・リーク解析とHotSpot JVM

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

オンラインサポート
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項