【问题标题】:How to use VisualVM to spot the bottleneck/problem如何使用 VisualVM 发现瓶颈/问题
【发布时间】:2011-08-23 14:13:20
【问题描述】:

正如我在 Performance drop after 5 days running web application, how to spot the bottleneck? 中发布的那样,我遇到了一个应用程序在运行一段时间后变慢的问题。

我让 VisualVM 运行并在不同时间之间制作了快照。现在应用程序真的很慢,但我不知道如何发现瓶颈。它们彼此之间没有太多区别,唯一增长一点的就是堆,它会在一段时间后成功地被垃圾回收。

谁能给我一些指点?

以下是快照(应用程序):

[1]http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html

[2]http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html

谢谢!

编辑:仔细观察,我注意到 CPU 甚至没有被太多使用......而且系统真的很慢!

【问题讨论】:

  • 在第二个快照中(超过一个小时,而第一个仅超过 4 秒),CPU 上有一些负载,而 GC 几乎没有负载。如果 CPU 是瓶颈,您应该尝试分析导致此问题的方法。您也可以在 jvisualvm 中执行此操作。
  • 应用在哪个应用服务器上运行?它是否在 Web 服务器前端之后?如果是,2如何连接(哪个模块)。

标签: java scala profiler visualvm


【解决方案1】:

作为第一步,我建议确定到底什么是慢的。它执行某些工作是否缓慢?或者在处理来自不同客户端的作业时表现出低吞吐量?

什么资源不足?

  • 如果您使用一些外部服务(如数据库或 RPC 服务器)总是记录它们的响应时间并在进行任何其他优化步骤之前检查它。
  • 可能是处理器能力不足。只需查看 CPU 使用率。
  • 可能是内存不足。使用 gc 日志记录来检测此类问题。有一个关于它的good topic
  • 可能是硬盘驱动器速度不足。使用 iostat 并了解您的硬盘性能限制。
  • 可能是网络吞吐量不足。检查网络频道使用情况。
  • 此外,您也有可能超出了某些特定于操作系统的限制,例如打开的文件和/或网络套接字的数量。检查您是否将所有操作系统级别的异常正确报告到日志文件中。

当您确定了哪些资源不足以及程序中受其影响的部分后,您可以尝试找到要优化的代码段。使用随机工具并通过它运行您的应用程序而不知道要查找什么是没有意义的。

从我个人的经验来看,当你只有一个缓慢的方法时,这是非常罕见的情况,可以通过探查器找到。很可能是算法中某处出现意外的 IO 和/或同步,或者数据库架构错误。

【讨论】:

    【解决方案2】:

    其实还有一些比 VisualVM 更好的工具。

    你可以试试 JProfiler,它是一个不错的分析器(但要付费)

    你可以试试 Netbeans 分析器,它是免费的,而且效果很好

    使用 VisualVM,您将只能看到应用程序的实际状态(内存和 cpu 使用情况、JMX、加载的类等)。

    【讨论】:

    • 有更好的工具;但这并不意味着您在这种情况下需要它们(我目前无法判断)。 JvisualVM 还包括一个分析器(检测和采样)和一个内存分析器。您还可以安装其他插件。
    • @ziggystar 很高兴知道,不知道!
    • @KicoLobo,VisualVM 是否显示应用程序触发的 sql 查询?
    • NetBeans 分析器似乎 VisualVM 嵌入在 NB IDE 中。他们甚至说如果你只想要一个独立的分析器,就下载 VisualVM (profiler.netbeans.org)。
    【解决方案3】:

    我不会立即假设它是您的应用程序的问题,如果它是基于 Windows 的系统,请查看病毒扫描程序,以及当时运行的任何更新调度程序。

    确保您的日志滚动并正确过滤调试,以免它们失控。

    检查 sql 快照是否有任何长时间运行的查询。检查数据库负载和数据库堆。

    如果您的 Visual VM 运行了一段时间,请确保您有一些线程准备好接受工作/连接将显示为黄色(空闲)。

    在黑暗中拍摄 Eclipse Memory Analyzer

    当您发现速度变慢时进行堆转储并通过分析器运行它。

    如果您在基于 unix 的系统上检查文件描述符 ulimit -a 以确保 java 进程没有被最大化。

    检查服务器上的 TCP NO 延迟和 Nagle 限制设置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2020-11-29
      • 2012-07-09
      • 2010-11-22
      • 2015-06-12
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多