14

我正在尝试解决大型复杂的tomcat java web应用程序的性能问题。目前最大的问题是,内存使用率会不时出现峰值,应用程序无法响应。我已经修复了所有可以使用日志分析器和日志文件的贝叶斯分析修复的问题。我正在考虑在生产tomcat服务器上运行一个profiler。分析生产中的Web应用程序的性能成本

的注与温和敏感性读者:

据我所知,有些人可能会发现配置的是生产应用的进攻的想法。请放心,我用尽了大部分其他选项。我正在考虑这个问题的原因是我没有资源来完全复制我的测试服务器上的生产设置,并且我一直无法在测试服务器上导致感兴趣的故障。

问题:

我找这工作无论是在Tomcat上运行的Java Web应用程序,或者回答一个语言无关的方式这个问题的答案。

  • 分析的性能成本是多少?
  • 为什么在生产环境中远程连接和分析Web应用程序是一个坏主意(奇怪的故障模式,安全问题等)的其他原因?
  • 性能分析对内存足迹有多大影响?
  • 特别是有java profiling工具具有非常低的性能成本?
  • 任何用于剖析Web应用程序的java剖析工具?
  • 有没有人有使用visualVM分析性能成本的基准?
  • visualVM可以扩展到什么尺寸的应用程序和数据集?
+0

你会碰巧在你的Webapp中有Apache FOP吗? – 2009-07-30 17:13:43

+0

我不这么认为,为什么会导致记忆问题? – 2009-07-30 17:48:47

回答

13

OProfile及其祖先DPCI是专为剖析生产系统而开发的。这些开销非常低,并且他们对您的完整系统进行了剖析,包括内核,因此您可以在内核和库中的VM 中发现性能问题。

回答您的问题:

  1. 开销:这些采样廓线仪,也就是说,它们产生定时器或performance counter中断在一些固定的间隔,他们看看什么码正在执行。他们用它来建立你的时间花在哪里的直方图,并且合理的采样间隔开销非常低(1-8%是they claim)。

    看看OProfile采样频率与开销的this graph。如果默认值不符合您的喜好,您可以调整采样频率以降低开销。

  2. 生产中的使用情况:使用OProfile的唯一警告是您需要将它安装到您的生产机器上。自从RHEL3以来,我相信Red Hat会提供内核支持,而且我非常确定其他发行版支持它。

  3. 内存:我不知道什么样的OProfile确切的内存占用,但我相信它保持相对较小的缓冲区周围,转储他们偶尔日志文件。

  4. Java: OProfile包括支持Java并知道在JIT中运行的代码的分析代理。因此,您将能够看到Java调用,而不仅仅是解释器和JIT中的C调用。

  5. 网络应用程序: OProfile是一个系统级别的分析器,所以它不知道Web应用程序可能具有的会话,事务等事情。

    这就是说,它是一个全系统分析器,因此,如果您的性能问题是由操作系统和JIT之间的不良相互作用引起的,或者如果它在一些第三方库,你就可以看到这一点,因为OProfile剖析了内核和库。这对于生产系统来说是一个优势,因为您可以发现由于测试环境中可能不存在的错误配置或生产环境细节而导致的问题。

  6. 的VisualVM:不知道这一个,因为我有VisualVM的

没有经验这里的a tutorial使用OProfile的发现性能瓶颈。

3

我已经使用YourKit在高负载生产环境中配置应用程序,虽然确实有影响,但它很容易被接受。您可以通过非侵入式的方式来完成此操作,例如选择性关闭更昂贵的特定分析功能(这实际上是一种滑动缩放)。

我最喜欢的一点是,您可以在YourKit代理运行的情况下运行虚拟机,并且它不会影响性能。只有当你连接GUI并开始分析时才会产生影响。

1

分析生产应用程序没有任何问题。如果您在分布式应用程序上工作,有时会发生在独特的概率情况下发生的内存异常,这种情况很难在dev/stage/uat环境中重现。

您可以尝试使用自定义分析器,但如果您急于插入/设置生产框中的upa分析器需要时间,也可以使用jvm进行内存转储(jvms内存转储也可以为您提供线程转储)

  1. 可以激活JVM命令行上自动生成,使用以下选项: -XX:+ HeapDumpOnOutOfMemoryError

  2. 他的Eclipse内存分析器项目称为一个非常强大的功能“按价值分组”,这使得建立一个对象成为可能通过字段值查询和重新组合实例。这在有很多实例包含一组较小的可能值的情况下很有用,并且您可以查看哪些值最常用。这确实帮助我理解了一些复杂的内存转储,因此我建议您尝试一下。

1

您也可以考虑使用现代HotSpot JVM之一--Java Flight Recorder和Java Mission Control。它是一组工具,可以让您收集底层的运行时信息,CPU的开销约为5%(无论如何,我无法证明最后一条声明,这是Oracle工程师介绍该功能和现场演示的声明)。

只要您的应用程序正在运行1_7u40 JVM或更高版本,就可以使用此工具。要启用运行时信息收集,您需要使用特定标志启动JVM:

默认情况下,JVM中禁用JFR。要启用JFR,您必须使用-XX:+ FlightRecorder选项启动Java应用程序。由于JFR是一项商业功能,仅适用于基于Java Platform Standard Edition(Oracle Java SE Advanced和Oracle Java SE套件)的商业软件包,因此您还必须使用选项启用商业功能。

(报价http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7

我说这个答案,因为这是在生产分析可行的选择海事组织。

此外还有一个Eclipse plugin支持JFR和JMC,并能够显示信息用户友好。

0

多年来,这些工具大大改进。现在,大多数有这些需求的人使用一种工具,该工具挂接到Java的检测API而不是分析API。当然还有更多的例子,但是想起了NewRelicAppDynamics。基于工具的解决方案通常作为JVM中的代理运行,并不断收集数据。他们报告数据的级别高于旧分析方法(业务事务,Web事务,数据库事务),并允许您在必要时深入挖掘(直至方法或行)。您甚至可以设置监控和警报,以便您可以跟踪/警示诸如页面加载时间和针对SLA的性能等指标。有了这些优秀的工具,你真的不应该再有理由在生产环境中运行分析器了。运行它们的成本可以忽略不计。