当无法建立分析会话时,首先要查看被分析(profiled)应用程序或应用服务器的终端输出。对于应用服务器,stderr流通常会被写入日志文件。这可能是一个单独的日志文件,而不是应用服务器的主日志文件。例如,WebSphere应用服务器会写入一个native_stderr.log文件,只有stderr输出会被包含在其中。根据stderr输出的内容,排查问题的方向会有所不同:
连接问题
如果stderr包含"Waiting for connection ...",说明被分析(profiled)应用程序的配置是正确的。此时问题可能与以下几个方面有关:
- 你是否忘记在本地机器上的JProfiler GUI中启动“Attach to remote JVM”会话?除非分析代理(profiling agent)配置为使用“nowait”选项立即启动,否则它会一直等待JProfiler GUI连接后才允许VM继续启动。
- 会话设置中的主机名或IP地址是否配置正确?
-
是否配置了错误的通信端口?通信端口与HTTP或其他标准端口号无关,且不能与任何已被占用的端口相同。对于被分析(profiled)应用程序,通信端口作为分析VM参数的一个选项进行定义。通过VM参数
-agentpath:<path to jprofilerti library>=port=25000,将会使用25000端口。 -
你是否尝试通过仅监听回环接口(loopback
interface)的直接连接方式连接代理?默认情况下,代理只监听回环接口。你可以配置JProfiler通过SSH隧道连接远程机器。如果不需要加密,也可以在
-agentpath参数中使用address=[IP address]选项。 - 本地机器与远程机器之间是否有防火墙?可能存在入站和出站连接的防火墙,甚至在中间网关机器上也可能有防火墙。
端口绑定问题
如果stderr包含无法绑定socket的错误信息,说明端口已被占用。在这种情况下,请检查以下几个方面:
- 你是否多次启动了被分析(profiled)应用程序?每个被分析(profiled)应用程序都需要单独的通信端口。
- 是否有之前分析运行(profiling run)遗留的僵尸Java进程(zombie Java processes)占用了端口?
- 是否有其他应用程序正在使用该通信端口?
如果stderr中没有以JProfiler>为前缀的行,并且你的应用程序或应用服务器正常启动,说明Java调用中未包含-agentpath:[path to
jprofilerti library] VM参数。你需要找出启动脚本中实际执行的Java调用,并在其中添加VM参数。
Attach问题
当attach到正在运行的JVM时,有时你可能在所有JVM列表中看不到目标JVM。要找出问题原因,首先需要了解attach机制的工作原理。当JVM启动时,会在临时目录下的hsperfdata_$USER目录写入一个PID文件,通过该文件被发现。只有相同用户或管理员用户才能attach到该JVM。JProfiler可以帮助你以管理员用户身份连接到JVM。
在Windows上,使用Show Services按钮可以显示所有JVM服务进程。JProfiler会安装一个辅助服务(helper service),该服务以系统账户(system account)运行,可以连接以系统账户或配置用户账户运行的服务。该服务名称为“JProfiler helper”,在点击该按钮时安装。你需要确认UAC提示以允许服务安装。当JProfiler退出时,该服务会被卸载。
在Linux上,你可以在attach对话框中使用用户切换器(user switcher)以root账户进行attach。无论是分析本地JVM,还是attach到远程Linux或macOS机器时,都会显示该用户切换器。对于远程attach场景,你也可以切换到其他非root用户。如果你有root密码,建议始终切换到root,而不是实际运行服务的用户。
如果在Linux上JVM不可见,而你认为它应该可见,问题通常与临时目录有关。一种可能性是/tmp/hsperfdata_$USER目录的访问权限不正确。在这种情况下,删除该目录并重启JVM。被attach的进程必须对/tmp具有写权限,否则不支持attach。
如果你使用systemd,你关注的进程可能在其systemd服务文件中设置了PrivateTmp=yes。此时pid文件会被写入其他位置。如果你在attach对话框中用用户切换器切换到root,或以root身份使用CLI工具,JProfiler会自动处理这种情况。
远程attach的自动代理下载
对于远程attach,JProfiler需要远程目标平台的代理库(agent
libraries)。如果本地不可用,JProfiler会尝试下载。如果存在防火墙阻止到https://download.ej-technologies.com的HTTPS连接,或通过中间人(man-in-the-middle)方式检查SSL连接以解密流量,则此操作可能失败。在后一种情况下,由于JProfiler没有防火墙的证书,HTTPS连接会失败。
当发生代理下载错误时,JProfiler提供了手动解决方案。会弹出一个对话框,显示如何从官网手动下载代理压缩包,并在继续远程attach操作前定位已下载的压缩包。
由于代理文件会被缓存,每个远程平台只需操作一次。当JProfiler升级后,代理会发生变化,需要重新下载。

