NetBeansからWebLogicのアプリケーションをプロファイリング

WebLogicで動作しているアプリケーションをプロファイリングしたいという要請があり、NetBeansのプロファイラを接続するという脱線をしましたのでメモ。
使用したのは、ノードマネージャで管理されLinuxサーバ上で動作している WebLogic 10 と、NetBeans 6.9.1 です。

接続先の設定

まず、NetBeansのメニューから[プロファイラ]->[プロファイラを接続…]を選択して、ダイアログを出します。既にプロファイラを接続したことがある場合は、接続モードの[変更…]リンクをクリックします。まだ、一度もプロファイラを使ったことがない場合は、[接続]ボタンをクリックします。

まずターゲットの種類を設定。右のように J2EE Web/アプリケーションサーバ および WebLogic 9+ を選択します。接続方法はリモートを選びます。

次に接続先を設定。WebLogicサーバのIPまたはホスト名、OS、JVMを適切に設定します(ここではlinux 32bit)。ちなみに、WebLogicは旧SunのVMで動作させていることを前提としています(JRockitは試していません)。

エージェントプログラムの配置

最後次にリモートパックというプロファイラのエージェントプログラムをWebLogicサーバ上に配置します。右のように手順がテキストで出てきますが、ここでは手順1と2までやります。手動3以降は、WebLogicサーバをシェル起動することを前提としているため、ノードマネージャで管理されているWebLogicだとそのまま適用しにくい内容となっています。

まず手順1については、「リモートパックを生成」ボタンを押すと、profiler-server-linux.zipというファイルが作られますので(対象のプラットフォームによってファイル名は異なります)、それをscpなどでサーバに転送し、WebLogicの実行ユーザが参照できる場所に展開します。例えば /opt/profiler に保存するなら次のような感じです。

$ mkdir /opt/profiler
$ cd /opt/profiler
$ unzip ~/profiler-server-linux.zip

展開が出来たら、手順2に従いWebLogicの実行ユーザキャリブレーションを実行します。

$ sh /opt/profiler/bin/calibrate.sh
Profiler Agent: JNI On Load Initializing...
Profiler Agent: JNI OnLoad Initialized successfully
Starting calibration...
Calibration performed successfully
...

エージェントを起動オプションに設定

さて、次は管理コンソールからWebLogicJVMの起動オプションの設定を行います。

管理コンソールにログインしたら、[サーバ]->(対象サーバ)->[コンフィグレーション]->[サーバの起動]と選択すると、右のような設定フォームとなります。この中にある、[引数]に以下を追加します。

-agentpath:/opt/profiler/lib/deployed/jdk15/linux/libprofilerinterface.so=/opt/profiler/lib,5140

もちろん、パスにはエージェントプログラムを展開した場所を適切に(かつ絶対パスで)指定してください。

変更を保存してサーバを再起動すると、プロファイラの接続待ち状態となり起動が一時停止しますので、そこにプロファイラを接続をします。

ルートメソッドの設定

まず、プロファイリングを開始するメソッド(ルートメソッド)を設定します。これを設定しないとリクエストに関係のない動作でもプロファイラが動き出すため重くなります。まず、「プロファイラを接続」ダイアログで、「アプリケーションの一部」を選択し、「定義…」リンクをクリックします。

プロジェクトから追加でも、手動で追加でも、構いません。大抵の場合、コントローラに相当するクラスを指定すればいいでしょう。今回は Teeda を使用しているアプリでしたので、右のように指定して、Pageクラスの全メソッドを対象としました。

対象クラスの設定

次に、プロファイリングの対象クラスを設定します。これは、ルートメソッドを起点にプロファイルが開始された後、処理時間を記録するメソッドを指定します。これを指定していないと、それこそStringの操作でも全て記録されてしまいますので、やはり重くなります。具体的には、「プロファイラを接続」ダイアログで、フィルタという形で設定します。予め用意されたフィルタもありますし、自分でよく使うパターンを登録しておくこともできますが、ここでは、「簡易フィルタ…」を選びます。

すると、右のようなダイアログが表示されますので、フィルタのパターンを入力します。今回はSQLの実行と結果フェッチのどちらがボトルネックになっているかを知りたかったので、Oracleドライバのクラスを指定したりしています。

やっと接続

最後に「接続」をクリックするとプロファイラがサーバに接続され、一時停止していたサーバが起動を再開します。サーバが完全に起動したら、アプリケーションにアクセスし、ルートメソッドに設定した処理が呼ばれるような操作を行います。そうするとプロファイリングが開始されるはずです。

リンク

NetBeansのプロファイラの詳細な使い方は、以下のリンクを参照してください。

また、プロファイラでの分析について、全般的に知りたい場合は以下の記事がよくまとめられていて良いと思います(NetBeansのバージョンがちょっと古いですが)。

2010/11/11 11:18
見にくかったので見出しを追加しました。あと、ちょこっと接続詞を修正