使用 hprof 分析 WebSphere 以获得 CPU 个样本输出

Profiling WebSphere with hprof for CPU SAMPLES output

我正在尝试在 IBM 堆栈(AIX 上的 J9 JVM/Linux)上使用 hprof 来分析 WebSphere。具体来说,我对 hprof 输出的 CPU 样本感兴趣,尤其是启动时间(从 WS 启动到 "ready for business")。

问题是,我无法在 hprof 结果文件中获得 CPU 样本输出。

我正在使用以下 JVM 参数来配置 hprof:-Xrunhprof:cpu=samples,file=path-to-hprof.txt,用于以 ASCII 格式转储 hprof 输出。根据生成的 hprof 输出,CPU SAMPLES 输出仅在程序退出时生成:

HEAP DUMP, SITES, CPU SAMPLES|TIME and MONITOR DUMP|TIME records are generated at program exit.

因此,为了在成功启动后优雅地关闭 WebSphere,我使用 stopServer.sh 脚本,并期望 CPU SAMPLES 输出出现在结果中 java.hprof.txt关机完成后的文件,但不是。

我做错了什么?是否有更好的方法将 hprof 与 WebSphere 一起使用并生成 CPU 分析输出?任何帮助将不胜感激!

编辑: 我在 RHEL 上 运行 WebSphere 8.0.0.11 版 IBM J9 VM(内部版本 2.6,JRE 1.6.0 20150619_253846) 7.5.

P.S.: 我也在寻找从管理控制台GUI关闭WS的方法,但没有找到。

P.P.S.: 与此同时,我正在使用非常好的 jvmtop tool with the --profile <pid> 选项,但它只提供了部分洞察力,与 hprof 相反,必须附加在飞,所以执行的某些部分丢失了。

感谢@kgibm 的有用提示,我意识到我走在了正确的轨道上,并在第二天回去再试一次。令人惊讶的是,这一次,它奏效了! hprof 文件是用预期的 WebSphere CPU 样本输出生成的。

我一直在尝试弄清楚我一开始就错了。这是我认为发生的事情:

  1. 起初,我在 WebSphere JVM 参数中指定了几个本机代理。这些代理的组合导致 WS 运行 慢得多。当我杀死 WS 时,Server server1 stop completed 消息被打印和 hprof.txt 被完全写入之间有几秒钟的时间。我相信在实际写入 CPU 示例输出之前我太快查看 hprof.txt

  2. 然后,为了解决这个问题,我在 hprof 参数中添加了 doe=n 参数。 doe代表退出时转储,默认为y。直到后来我才意识到这可能是错误的,因为正如引用的那样,CPU 样本输出仅在退出时生成。

我认为这两个问题共同导致了我的困惑,所以当我开始清理时,一切正常。

也许在 hprof documentation 中值得澄清的是 doe=n 选项与 cpu=samples 冲突,并且可能与退出时写入的其他选项冲突(我没有在文档中看到这样的指示,但我可能错过了它)。