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

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

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

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

问题:

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

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

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

回答你的问题:

  1. 开销:这些是采样分析器,也就是说,它们以某个固定间隔生成定时器或性能计数器中断,并且它们会查看当前正在执行的代码。 他们使用它来构建您花费时间的直方图,并且对于合理的采样间隔,开销非常低(1-8%是他们声称的 )。

    看一下OProfile的采样频率与开销之间的关系图 。 如果默认值不符合您的喜好,您可以调整采样频率以降低开销。

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

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

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

  5. Web应用程序: OProfile是一个系统级的分析器,因此它不知道Web应用程序可能具有的会话,事务等内容。

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

  6. VisualVM:不确定这个,因为我没有使用VisualVM的经验

这是一个使用OProfile查找性能瓶颈的教程 。

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

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

分析生产应用程序没有任何问题。 如果您处理分布式应用程序,有时会在非常独特的概率场景中发生外部存储exception,这在dev / stage / uat环境中非常难以重现。

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

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

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

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

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

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

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

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

还有一个Eclipse插件 ,它支持JFR和JMC,并且能够显示用户友好的信息。

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