プロファイリングセッションを確立できない場合、最初に確認すべきなのは、プロファイルされたアプリケーションまたはアプリケーションサーバーのターミナル出力です。アプリケーションサーバーの場合、stderrストリームは多くの場合ログファイルに書き込まれます。これはアプリケーションサーバーのメインログファイルとは別のログファイルである場合があります。例えば、WebSphereアプリケーションサーバーは、stderr出力のみが含まれるnative_stderr.logファイルを書き出します。stderr出力の内容によって、問題の調査方法が異なります。
接続の問題
stderrに"Waiting for connection ..."と表示されている場合、プロファイルされたアプリケーションの設定は正しく行われています。問題は次のような点に関連している可能性があります。
- JProfiler GUIのローカルマシンで「Attach to remote JVM」セッションを開始し忘れていませんか?プロファイリングエージェントが「nowait」オプションで即時起動するように設定されていない限り、JProfiler GUIが接続するまでVMの起動を待機します。
- セッション設定でホスト名またはIPアドレスが正しく設定されていますか?
-
通信ポートの設定を間違えていませんか?通信ポートはHTTPや他の標準ポート番号とは関係なく、既に使用中のポートと同じにしてはいけません。プロファイルされたアプリケーションでは、通信ポートはプロファイリングVMパラメータのオプションとして定義されます。例えば、VMパラメータ
-agentpath:<path to jprofilerti library>=port=25000の場合、25000番ポートが使用されます。 -
ループバックインターフェースのみで待ち受けているエージェントに直接接続しようとしていませんか?デフォルトでは、エージェントはループバックインターフェースのみで待ち受けます。JProfilerでSSHトンネルを設定してリモートマシンに接続することもできます。暗号化が不要な場合は、
address=[IP address]オプションを-agentpathパラメータで使用できます。 - ローカルマシンとリモートマシンの間にファイアウォールはありませんか?着信・発信接続用のファイアウォールや、中間のゲートウェイマシン上のファイアウォールが存在する場合もあります。
ポートバインディングの問題
stderrにsocketのバインドができないというエラーメッセージが表示されている場合、そのポートは既に使用中です。その場合、次の点を確認してください。
- プロファイルされたアプリケーションを複数回起動していませんか?各プロファイルされたアプリケーションには個別の通信ポートが必要です。
- 以前のプロファイリング実行のゾンビJavaプロセスがポートをブロックしていませんか?
- 他のアプリケーションが通信ポートを使用していませんか?
stderrにJProfiler>で始まる行がなく、アプリケーションやアプリケーションサーバーが正常に起動する場合、-agentpath:[path to
jprofilerti library]というVMパラメータがJavaの起動コールに含まれていません。起動スクリプト内で実際に実行されているJavaコールを特定し、そこにVMパラメータを追加してください。
アタッチの問題
実行中のJVMにattachする際、目的のJVMがJVM一覧に表示されない場合があります。この問題の原因を特定するには、attachメカニズムの仕組みを理解することが重要です。JVMが起動すると、一時ディレクトリ内のhsperfdata_$USERディレクトリにPIDファイルを書き込み、それによって検出されます。同じユーザーまたは管理者ユーザーのみがそのJVMにattachできます。JProfilerは管理者ユーザーとしてJVMに接続するのをサポートします。
Windowsでは、Show Servicesボタンを使用してすべてのJVMサービスプロセスを表示できます。JProfilerは「JProfiler helper」という名前のヘルパーサービスをインストールし、システムアカウントで実行されているサービスや設定されたユーザーアカウントで実行されているサービスに接続できます。このサービスはそのボタンをクリックしたときにインストールされます。サービスのインストールを許可するためにUACプロンプトの確認が必要です。JProfilerを終了すると、このサービスは自動的にアンインストールされます。
Linuxでは、attachダイアログのユーザースイッチャーを使ってrootアカウントでattachできます。このユーザースイッチャーはローカルJVMのプロファイリング時や、リモートLinuxまたはmacOSマシンへのattach時にも表示されます。リモートattachの場合、root以外の別ユーザーにも切り替え可能です。rootパスワードがある場合は、サービスを実行している実ユーザーではなく、必ずrootに切り替えてください。
LinuxでJVMが見えない場合、通常は一時ディレクトリに関連した問題です。一つの可能性として、/tmp/hsperfdata_$USERディレクトリのアクセス権が正しくないことが挙げられます。その場合はディレクトリを削除し、JVMを再起動してください。attach対象プロセスは/tmpへの書き込み権限が必要です。権限がない場合、attachはサポートされません。
systemdを使用している場合、対象プロセスのsystemdサービスファイルでPrivateTmp=yesが設定されている可能性があります。その場合、pidファイルは別の場所に書き込まれます。attachダイアログのユーザースイッチャーでrootユーザーに切り替えるか、CLIツールをrootで使用すれば、JProfilerがこの状況に対応します。
リモートアタッチ用の自動エージェントダウンロード
リモートattachの場合、JProfilerはリモートターゲットプラットフォーム用のエージェントライブラリを必要とします。ローカルに存在しない場合、自動的にダウンロードを試みます。この操作は、https://download.ej-technologies.comへのHTTPS接続をファイアウォールがブロックしている場合や、SSL接続を中間者攻撃方式で復号して検査している場合に失敗することがあります。後者の場合、JProfilerがファイアウォールの証明書を持っていないため、HTTPS接続が失敗します。
エージェントのダウンロードエラーが発生した場合、JProfilerは手動での対処方法を提供します。ダイアログが表示され、ウェブサイトからエージェントアーカイブを手動でダウンロードし、ダウンロードしたアーカイブを指定してリモートattach操作を続行する手順が案内されます。
エージェントファイルはキャッシュされるため、これは各リモートプラットフォームごとに一度だけ必要な操作です。JProfilerがアップデートされるとエージェントが変更されるため、再度ダウンロードが必要になります。

