我有一个处理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问题,但我还不足以证明或反驳这一理论,我对其他建议持开放态度。
答案 0 :(得分:1)
我们定期将jconsole(和其他工具)直接连接到生产环境。对我们来说没有明显的开销,仪器已经在JVM中进行,因此您只需连接远程进程即可读取已发布的值。我说去吧!
无论哪种方式,你真的需要看看盒子上发生了什么。线程转储可能或做一些内部检测。通过内部仪器,我的意思是在代码中记录关键度量并以某种方式暴露它们。它本质上就是JVM所做的事情(通过JMX公开它们),但是自己滚动它会让你更具特异性。例如,我经常在内部记录请求/响应或其他关键路径性能时序。
哦,还有一件事。您可以将应用设置为使用代理提供更多信息。通常这是插入一个分析器(如jprofiler或yourkit),但确实通常会增加更多开销,不建议用于生产。还值得考虑不从VM获取所需信息的成本。例如,在监控时,不解决问题的成本是否高于或低于性能下降的一小部分成本?
更科学地说,article有一些评论。它表明高达7%的开销(与我之前的观点相矛盾),2006年的一篇文章显示3-4%,但两者都是高度语境化的结果。例如,CPU密集型应用程序可能受到或不受IO绑定的影响。
因此,从我这里获得更合适的答案(而不仅仅是“追求它”)将通过衡量来了解它对您的应用在您的环境中的影响。在类似的生产环境中运行代表性测试,连接并断开jconsole,并为自己查看。
答案 1 :(得分:1)
您可以在HP-UX上执行一些操作,以便从正在运行的Java进程获取其他信息。如果将PROF信号发送到JVM,它将切换GC日志的生成(就像您使用了-Xverbosegc命令行选项一样)。生成GC日志非常便宜,因此您应该能够在生产中启用它而不影响性能。
如果将USR2信号发送到JVM,它将开始分析(与-Xeprof相同)。如果您再次发送信号,则会关闭分析。这会产生明显的性能影响,但它会比您从外部第三方分析器中看到的要小。
您可以使用HPjmeter分析生成的数据文件。 HPjmeter还可以连接到正在运行的JVM进行实时监控。使用Java 5,您需要使用-agentlib选项启动JVM。如果您使用的是Java 6,则无需任何额外的命令行选项即可附加到正在运行的JVM。