在生产中分析Web应用程序的性能成本

时间:2009-07-30 16:41:00

标签: java language-agnostic profiling production-environment visualvm

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

温和敏感的读者注意事项:

据我所知,有些人可能会发现将生产应用程序分析为冒犯的概念。请放心,我已经用尽了大部分其他选择。我考虑这个的原因是我没有资源在我的测试服务器上完全复制我们的生产设置,而且我无法在我的测试服务器上引起感兴趣的失败。

问题:

我正在寻找能够在tomcat上运行的java Web应用程序,或者以语言无关的方式回答这个问题的答案。

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

5 个答案:

答案 0 :(得分:13)

OProfile及其祖先DPCI是为分析生产系统而开发的。这些开销非常低,它们会分析您的完整系统,包括内核,因此您可以在内核和库中的VM 中找到性能问题。 / p>

回答你的问题:

  1. 开销:这些是采样分析器,也就是说,它们会定期生成定时器或performance counter个中断,然后看看在什么代码当前正在执行。他们使用它来构建你花费时间的直方图,并且开销非常低(1-8%是they claim)合理的采样间隔。

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

  2. 生产中的使用:使用OProfile的唯一警告是您需要在生产计算机上安装它。我相信自RHEL3以来Red Hat的内核支持,我很确定其他发行版支持它。

  3. 内存:我不确定OProfile的确切内存占用量是多少,但我相信它会保留相对较小的缓冲区并偶尔将它们转储到日志文件中。

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

  5. 网络应用:OProfile是一个系统级的探查器,因此它不知道网络应用会有的会话,交易等内容。

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

  6. VisualVM:对此不确定,因为我没有VisualVM经验

  7. 这是使用OProfile查找性能瓶颈的a tutorial

答案 1 :(得分:3)

我已经使用YourKit在高负载的生产环境中分析应用程序,虽然确实存在影响,但它很容易被接受。 Yourkit makes a big deal能够以非侵入性方式执行此操作,例如选择性地关闭某些更昂贵的分析功能(实际上是滑动比例)。

我最喜欢的方面是你可以在运行YourKit代理的情况下运行VM,而且它对性能没有影响。只有当你连接GUI并开始分析它才有效时。

答案 2 :(得分:1)

分析制作应用程序没有任何问题。如果您处理分布式应用程序,有时会在非常独特的概率场景中发生outofmemory异常,这很难在dev / stage / uat环境中重现。

您可以尝试使用自定义分析器但是如果您赶时间并且在生产盒上插入/设置分析器需要时间,您还可以使用jvm进行内存转储(jvms内存转储也为您提供线程)转储)

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

  2. Eclipse Memory Analyzer项目有一个非常强大的功能,称为“按值分组”,这使得构建对象查询并通过字段值重新组合实例成为可能。如果您有许多实例包含较小的可能值集,并且您可以查看最常使用的值,则此选项非常有用。这确实帮助我理解了一些复杂的内存转储,所以我建议你试一试。

答案 3 :(得分:1)

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

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

  

默认情况下,JVM中禁用JFR。要启用JFR,必须使用 -XX:+ FlightRecorder 选项启动Java应用程序。由于JFR是商业功能,仅在基于Java平台,标准版(Oracle Java SE Advanced和Oracle Java SE Suite)的商业软件包中提供,因此您还必须使用 -XX:+ UnlockCommercialFeatures <启用商业功能。 / strong>选项。

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

我添加了这个答案,因为这是在生产IMO中进行性能分析的可行选项。

还有Eclipse plugin支持JFR和JMC,并且能够显示用户友好的信息。

答案 4 :(得分:0)

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