0

我有一个处理 SOAP 请求的 J2EE java 应用程序。在我们的生产环境(HPUX、OC4J、Java 5)中,我们有大约 20 个线程为此进程运行,有时我们会看到 1 个线程暂停约 15 秒。直到现在,我还没有成功地在我们的预生产环境中复制这个问题,如果我在我们的生产服务器上使用 jconsole 和相关工具,我害怕破坏东西和违反 SLA。

谁有灵感?我知道http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf但我想念敢于在生产中直接使用它的经验(另外,HPUX 的人把其中一些工具扔出了工具箱,用 HPJMeter 替换它们)

此外,尽管这对我来说是一个 GC 问题,但我还没有足够的知识来证明或反驳这个理论,我对其他建议持开放态度。

4

2 回答 2

1

您可以在 HP-UX 上执行一些操作来从正在运行的 Java 进程中获取更多信息。如果您将 PROF 信号发送到 JVM,它将切换 GC 日志的生成(就像您使用了 -Xverbosegc 命令行选项一样)。生成 GC 日志非常便宜,因此您应该能够在生产中打开它而不会影响性能。

如果您将 USR2 信号发送到 JVM,它将开始分析(与 -Xeprof 相同)。如果您再次发送信号,它将关闭分析。这将产生明显的性能影响,尽管它比您从外部第三方分析器看到的要小。

您可以使用 HPjmeter 分析生成的数据文件。HPjmeter 还可以连接到正在运行的 JVM 以进行实时监控。对于 Java 5,您需要使用 -agentlib 选项启动 JVM。如果您使用的是 Java 6,则可以附加到正在运行的 JVM,而无需任何额外的命令行选项。

于 2011-10-05T20:37:34.360 回答
1

我们定期将 jconsole(和其他工具)直接连接到生产环境。对我们来说没有显着的开销,检测已经在 J​​VM 中进行,所以您只需连接一个远程进程来读取发布的值。我说去吧!

不管怎样,你真的需要看看盒子上发生了什么。线程转储可能会或做一些内部检测。通过内部检测,我的意思是在代码中记录关键措施并以某种方式公开这些措施。它本质上是 JVM 所做的(通过 JMX 公开它们),但是滚动你自己的会给你更多的特异性。例如,我经常在内部记录请求/响应或其他关键路径性能时序。

哦,还有一件事。您可以将您的应用设置为使用代理来提供更多信息。通常这是插入一个分析器(如 jprofiler 或 yourkit),但这通常会增加更多开销,不建议用于生产

不从 VM 中获取所需信息的成本也值得考虑。例如,不解决问题的成本是否高于或低于监控时性能下降一小部分的成本?

更科学的,这篇文章有一些评论。它建议高达 7% 的开销(与我之前的观点相矛盾),2006 年的一篇文章建议 3-4%,但两者都是高度上下文相关的结果。例如,CPU 密集型应用程序可能会或可能不会受到比 IO 密集型应用程序更多的影响。

所以我的一个更合适的答案(而不仅仅是“去做”)是通过测量来了解它对您的环境中的应用程序的影响。在与 jconsole 连接和断开连接的类似环境中运行代表性测试,并亲自查看。

另请参阅此stackoverflow 问题

于 2011-09-07T08:39:10.823 回答