【问题标题】:How to profile a distributed app in java?如何在 Java 中分析分布式应用程序?
【发布时间】:2011-08-10 23:16:17
【问题描述】:

我有一个应用程序在统一的 Java 进程网格上运行(可能在不同的物理机器上)。我想从这个应用程序的一次运行中收集 cpu 使用统计信息。我浏览了分析工具,寻找自动收集数据的选项,但在 netbeans、tptp、jvisualvm、yourkit 等中找不到任何工具。

也许我看错了?

我的想法是:

  • 使用允许它们转储分析信息的一些特殊设置在网格上运行进程
  • 像往常一样运行我的应用程序 - 它会将任务推送到网格,进程将执行任务并发布分析信息
  • 使用一些工具来收集和分析分析结果

但我找不到任何与此类似的东西。

有什么想法、经验、建议吗?

谢谢!

【问题讨论】:

  • “收集”有点含糊。对于在多个节点上运行的每个方法 A,您希望在所有节点上累积方法 A 的 CPU 吗?或者您想查看每个节点 1..k 的 A(N1)、A(N2)、A(Nk) 的时间?您想要每个节点的某种调用图吗?所有节点的一些联合调用图(如何定义)?
  • 事实是我不确定该方法。实际上,我的网格有点异构,这增加了问题。但我希望使用 map-reduce 之类的东西的人会面临同样的问题?我的目标是了解在网格上需要 5 分钟才能完成的 100 个计算小时是如何分布在各个网格节点上实际发生的调用之间的。
  • 这些节点是否都运行相同的代码,并且您正在做一些数据并行的事情?还是计算是异构的?
  • 所有节点都运行相同的代码,因此从计算上讲,网格是同质的。

标签: java profiling distributed


【解决方案1】:

如果你看一下 zabbix 之类的东西(尽管还有很多其他的监控工具),它允许通过 JMX 从 Java 应用程序收集数据。如果您在应用程序中启用 JMX 并允许对其进行外部查询(通过 TCP/IP),您将可以访问许多热点内部(空闲内存等)以及线程堆栈等。然后您可以将这些值绘制为好吧。它确实需要配置,但您正在寻找的东西不认为可以用一行脚本来完成。

【讨论】:

  • 事实上,如果您允许远程 JMX 访问,您甚至可以使用 JConsole 来监控每​​个进程。
  • 我有完全访问权限,没有防火墙,jmx 已启用,我可以运行 jstatd 等。虽然对配置 CPU 并没有帮助 =(
  • 无法在 jconsole 中进行 CPU 分析——它是特定于操作系统的。
【解决方案2】:

如果您允许远程 JMX 访问并且您使用的是 SUN JDK 1.6,那么请尝试使用 jvisualvm。它具有远程 JMX 连接的选项。虽然我还没有将它用于在分布式环境中分析 CPU。

注意:对于CPU 分析,您的应用程序应该在 SUN JDK 1.6 或更高版本上运行。

看看这些链接:

  1. JVisualVM
  2. JVisualVM - Working with Remote Applications
  3. Get heap dump from a remote application in Java using JVisualVM
  4. Unable to profile JBoss 5 using jvisualvm
  5. http://www.taranfx.com/java-visualvm

【讨论】:

  • 正如我在我的 qn JVM 中提到的那样并没有真正的帮助,因为我无法将网格上的结果合并为 1 个大结果进行分析。
  • @atamur:我真的很愚蠢,不知何故跳过了它。很抱歉。
  • JVisualVM 有一个非常好的开放式架构来构建插件,所以你可以很容易地将来自多个 CPU 的结果放到一个视图中。然而,一个问题将是相关性,尤其是在地理分布广泛的网格上。此外,您可能希望在作业到达网格节点后查看标准 CPU 配置文件与时间的关系。这可能很难做到。
【解决方案3】:

http://www.hyperic.com/products/open-source-systems-monitoring

我从未尝试过其他答案中提到的其他工具。我对 hyperic 非常满意。 它还公开了 Web 服务 API,您可以使用它来编写自己的分析工具。

【讨论】:

  • 快速扫描他们的网站,我找不到任何关于详细 cpu 分析的信息(我正在寻找)
  • 如果您正在寻找哪个代码块花费更多时间,那么您需要使用您提到的分析工具。 Hyperic 为您提供特定节点上使用的 CPU、内存等百分比。我不知道是否有任何工具可以汇总来自不同节点的信息并为您提供详细信息。这也适用于代码分析工具。
【解决方案4】:

如果您知道要分析的关键路径,我建议您在关键位置标记您的流程并自己组合日志。这可能是对您的分析有用的补充,可以在生产中使用,因此可能会更有用。 (这是我的项目)

我曾使用 YourKit 一次监控多个进程。它可以实时向您显示每个发生的事情,并在所有完成后收集结果。

我不知道它是否提供了正在发生的事情的综合视图。

【讨论】:

  • 我已经有了这样的机制,但是随着新功能/代码路径的添加,维护它变得非常痛苦
【解决方案5】:

只是在每个节点上添加分析信息通常包含时间戳。

为了匹配这些时间戳,所有机器都应该具有完全相同的时间(最大 10 毫秒增量)

集群节点应与单源网络时间服务器 (NTP) 同步

【讨论】:

    【解决方案6】:

    您可以使用一些 JMX 库,例如jmxterm 并将其包装在一些代码中以连接到多个主机并轮询它们以进行更改。如果您对 Python 有点熟悉,请在此处查看我的简单脚本以获得一些灵感:http://rostislav-matl.blogspot.com/2011/02/monitoring-tomcat-with-jmxterm.html

    【讨论】:

      【解决方案7】:

      我正在寻找类似的东西,发现Hyperic

      Claims 是一种工具,可以监控最常见的应用程序和系统,收集所有信息并以方便的方式呈现。

      说实话,这在我的待办事项清单上,所以我不能说它是否能完成这项工作。无论如何,它似乎令人印象深刻。

      【讨论】:

        【解决方案8】:

        我使用CA Introscope 进行此类监控。它使用 Instrumentation 随时间收集指标。例如,它可以配置为向您提供所有节点及其随时间推移的性能的视图。从该节点视图中,您可以深入到方法级别,以帮助您找出瓶颈所在。

        是的,它将提供 CPU 利用率。

        它是一种商业化的 $$$ 工具,但它是收集、监控和查询性能数据的绝佳工具。

        【讨论】:

          猜你喜欢
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多