【问题标题】:Performance Cost of Profiling a Web-Application in Production在生产环境中分析 Web 应用程序的性能成本
【发布时间】:2010-11-15 12:29:58
【问题描述】:

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

敏感读者须知:

我知道有些人可能会觉得对生产应用程序进行剖析的想法很冒犯。请放心,我已经用尽了大部分其他选项。我考虑这样做的原因是我没有资源在我的测试服务器上完全复制我们的生产设置,并且我无法在我的测试服务器上导致感兴趣的故障。

问题:

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

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

【问题讨论】:

  • 您的 Web 应用中会碰巧有 Apache FOP 吗?
  • 我不相信,为什么会导致内存问题?
  • FOP 将基于 XML 的文档呈现为 PDF 和其他类似格式。 '09 中的当前版本在处理时使用的内存与文档的大小成正比,导致出现您所描述的症状。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    回答您的问题:

    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. Web 应用程序:OProfile 是一个系统级分析器,因此它不知道 Web 应用程序可能具有的会话、事务等内容。

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

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

    这里是a tutorial,关于使用 OProfile 查找性能瓶颈。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

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

        【讨论】:

        • 默认模板的开销约为 1%。
        • @KireHaglin 更没想到:)
        • 请注意,这些是商业功能,如果在生产环境中使用,您需要支付 oracle 费用,而不是免费使用的传统 JDK。
        • @ThorbjørnRavnAndersen 不完全是。如果您使用 Oracle HotSpot 通过您的应用程序赚钱,这需要您向 Oracle 付费。
        • 感谢赏金,非常感谢 :)
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-10
          • 2017-12-18
          • 1970-01-01
          • 2013-03-06
          • 2011-10-25
          • 2012-12-31
          相关资源
          最近更新 更多