接続問題のトラブルシューティング
プロファイリングセッションを確立できない場合、最初に行うべきことは、プロファイルされたアプリケーションまたはアプリケーションサーバーのターミナル出力を確認することです。アプリケーションサーバーの場合、stderrストリームはしばしばログファイルに書き込まれます。これは、アプリケーションサーバーのメインログファイルではなく、別のログファイルである場合があります。例えば、Websphereアプリケーションサーバーは、native_stderr.log
ファイルにstderr出力のみを含めて書き込みます。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にソケットをバインドできないというエラーメッセージが含まれている場合、ポートは既に使用されています。その場合、次の質問を確認してください:
- プロファイルされたアプリケーションを複数回起動しましたか?各プロファイルされたアプリケーションには、別々の通信ポートが必要です。
- 前回のプロファイリング実行のゾンビJavaプロセスがポートをブロックしていますか?
- 通信ポートを使用している別のアプリケーションがありますか?
stderrにJProfiler>
で始まる行がなく、アプリケーションまたはアプリケーションサーバーが正常に起動する場合、-agentpath:[path to
jprofilerti library]
VMパラメータがJava呼び出しに含まれていません。実際に実行されるスタートアップスクリプト内のJava呼び出しを見つけて、そこにVMパラメータを追加する必要があります。
アタッチの問題
実行中のJVMにアタッチする際、すべてのJVMのリストに関心のあるJVMが表示されないことがあります。この問題の原因を見つけるには、アタッチメカニズムがどのように機能するかを理解することが重要です。JVMが起動すると、hsperfdata_$USER
ディレクトリにPIDファイルを書き込み、それによって発見されます。同じユーザーまたは管理者ユーザーのみがJVMにアタッチできます。JProfilerは、管理者ユーザーとしてJVMに接続するのを助けることができます。
Windowsでは、Show Servicesボタンを使用してすべてのJVMサービスプロセスを表示します。JProfilerは、システムアカウントで実行されるサービスに接続できるシステムアカウントで実行されるヘルパーサービスをインストールします。このサービスの名前は"JProfiler helper"であり、そのボタンをクリックするとインストールされます。サービスのインストールを許可するためにUACプロンプトを確認する必要があります。JProfilerが終了すると、サービスは再びアンインストールされます。
Linuxでは、アタッチダイアログでユーザースイッチャーを使用してrootアカウントでアタッチできます。このユーザースイッチャーは、ローカルJVMをプロファイリングする場合やリモートLinuxまたはmacOSマシンにアタッチする場合に表示されます。リモートアタッチの場合、別の非rootユーザーに切り替えることもできます。rootパスワードがある場合は、サービスを実行している実際のユーザーではなく、常にrootに切り替えてください。
LinuxでJVMが表示されない場合、通常は一時ディレクトリに関連する問題です。/tmp/hsperfdata_$USER
ディレクトリのアクセス権が間違っている可能性があります。その場合、ディレクトリを削除してJVMを再起動してください。アタッチされるプロセスは/tmpへの書き込みアクセス権を持っている必要があります。そうでない場合、アタッチはサポートされません。
systemdを使用している場合、関心のあるプロセスにPrivateTmp=yes
がsystemdサービスファイルに設定されている可能性があります。その場合、pidファイルは異なる場所に書き込まれます。アタッチダイアログのユーザースイッチャーでrootユーザーに切り替えるか、CLIツールをrootとして使用することで、JProfilerはこれを処理します。
リモートアタッチのための自動エージェントダウンロード
リモートアタッチの場合、JProfilerはリモートターゲットプラットフォーム用のエージェントライブラリを必要とします。ローカルに利用できない場合、ダウンロードを試みます。この操作は、https://download.ej-technologies.com
へのHTTPS接続をブロックするファイアウォールがある場合や、トラフィックを復号化するために中間者攻撃スキームでSSL接続を検査するファイアウォールがある場合に失敗することがあります。後者の場合、JProfilerはファイアウォールの証明書を持っていないため、HTTPS接続は失敗します。
エージェントダウンロードエラーが発生した場合、JProfilerは手動の回避策を提供します。ダイアログが表示され、ウェブサイトからエージェントアーカイブを手動でダウンロードし、リモートアタッチ操作を続行する前にダウンロードしたアーカイブを見つけるための指示が示されます。
エージェントファイルはキャッシュされるため、これは各リモートプラットフォームに対して一度だけの操作です。JProfilerが更新されると、エージェントが変更され、ダウンロードを再度行う必要があります。