14

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

给具有温和敏感性的读者的注意事项:

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

问题:

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

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

5 回答 5

13

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 查找性能瓶颈的教程

于 2009-07-30T16:59:43.243 回答
3

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

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

于 2009-07-30T16:47:06.203 回答
1

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

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

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

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

于 2014-04-27T00:55:51.147 回答
1

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

只要您的应用程序运行1_7u40JVM 或更高版本,您就可以使用此工具。要启用运行时信息收集,您需要使用特定标志启动 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 插件,它支持 JFR 和 JMC,并且能够以用户友好的方式显示信息。

于 2014-04-30T00:19:34.590 回答
0

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

于 2014-05-03T00:37:32.043 回答