【问题标题】:Troubleshooting a Hanging Java Web App对挂起的 Java Web 应用程序进行故障排除
【发布时间】:2011-07-05 18:02:26
【问题描述】:

我有一个在高负载下挂起的 Web 应用程序。我不打算详细介绍代码,因为我真的只是想要一些故障排除建议和工具建议。

这是一个网络应用程序,所以每个请求都是一个线程。在高负载测试下,应用程序开始消耗所有 CPU,同时变得无响应。我怀疑请求线程挂在我们正在测试的新代码中。由于 cpu 消耗的事实,我假设这必须在我的应用程序端。我的理解可能是错误的,总 cpu 消耗表明我的第一个故障排除工作应该是查看消耗这些周期的代码。

有哪些工具和/或方法可以检查哪些线程挂起以及在哪些代码行上?同样,我可以轻松地强制应用程序进入有问题的行为。

我已经找到并尝试了 visualvm。似乎是完美的工具。虽然仍然开放的建议。我查看了 Eclipse TPTP,它似乎即将报废,并且需要更重的部署。

【问题讨论】:

  • 挂起时暂停一下。查看每个线程。你会明白为什么它被挂起。 jstack 也应该给你同样的信息。您不需要任何大工具。
  • @Mike Dunlavey 谢谢。这是个好建议。最初,我认为我想要可用的最轻量级的工具,jstack 肯定有资格作为。在尝试加快使用TPTP 的速度时,我放弃了这种努力,转而追求更轻的工具。但是,visualvm 对于电动工具来说重量非常轻。只需安装并打开。所有 java 1.6(更新 7)和更高版本的应用程序都简单地显示在该工具中。
  • 听起来visualvm 是一款优质应用。不幸的是,从文档中可以看到suffer from these common problemsjstack 是一个粗糙的工具,但它会带你直接解决问题。其他按行报告百分比的墙上时间堆栈采样器是 Zoom、可能是 Shark,可能还有 oprofile。

标签: multithreading performance


【解决方案1】:

您可以在启动线程和关闭线程时插入日志消息。然后您启动应用程序并在穿透代码的同时检查输出。

另一种方法是查找内存泄漏。如果你确定你没有,你可以扩展你的 JVM 的虚拟内存。

【讨论】:

  • 根据我使用top 等工具看到的情况,该应用程序没有内存问题。问题是它消耗了所有的 cpu。
  • 在不查看代码的情况下很难弄清楚它是什么。以下是一些一般提示:尝试精简线程启动的方法,尝试实例化尽可能少的对象,尝试在线程之间共享内存,这样它们就不必一次又一次地计算一些结果
【解决方案2】:

@chad:您是否有完整的数据库...您可能想从查看数据库方面发生的事情开始...您可以很好地查看数据库锁、当前会话等。

【讨论】:

  • 如果我错了,请纠正我,但应用程序端的cpu消耗并不表示数据库问题?事实上,我也监控了数据层和网络流量,这被排除在外。我将重新编辑我的问题,表明数据层被认为不是问题。
  • @chad:在这种情况下,为您的每个用例尝试一个 jprobe 工具。它可以为您提供分层的时间消耗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多