当探查器无法收集样本时,如何调试无响应的服务器?

ama*_*loy 5 java performance profiling clojure yourkit

我一直在处理我写的服务器的问题.它在Clojure中,但我认为这并不重要,我们可以假装它是用Java编写的.无论如何,它工作正常,在一个小时的时间,但进入配合它的表现非常糟糕:所有的活动停止,为大约十五秒钟,然后它正常工作了几秒钟,然后停止十五秒...等(通常)大约十分钟左右,然后恢复正常行为.

我用YourKit做了很多分析,我排除了一些看似合理的嫌疑人:

  • 这不是垃圾收集问题:我正在运行它-XX:+UseConcMarkSweepGC,并且我已经验证了服务器在次要和主要集合期间继续运行正常,因为这个垃圾收集器的并发性质.当我们耗尽总内存或其他东西时,我们并没有挣扎:当前堆大小远低于其最大值.

  • 我不认为这是一个锁定/同步问题,但我不是100%肯定.YourKit分析器有时会显示等待的线程,例如通过锁定来竞争System.out以生成日志消息,但是当没有任何事情要做时,唯一的长等待是线程池中的工作线程.当然,YourKit说它从来没有发现任何死锁.

  • 这不是因为连接了探查器而引起的,因为即使我启动服务器然后在不附加探查器的情况下单独使用它仍然会发生.

  • 这不是系统占用所有CPU时间的其他过程:top我的java进程显示CPU使用率为100%,其他所有内容基本上为0%.

我最大的问题是,在这些奇怪的问题中我无法看到服务器正在做什么,因为探查器停止接收样本.这是CPU使用率图表的图表:

YourKit CPU图表截图

图的左侧是正常操作,在此期间我们每隔一秒左右获得一次探查器样本.右侧是"破碎的",并且非常尖刻,因为探测器每10秒左右才会获取样品.在它确实获得的样本中,服务器似乎正在做其通常的业务:响应请求等等; 和日志确认它是做正常的东西,但只能在次探查具有样本:在图表上,为此,探查有没有样品向上倾斜"直线",服务器都无所事事.

那么,这个图表对任何人来说都很熟悉吗?你以前遇到过这个问题并修好了吗?或者你能指出一个工具的方向,可以找出我的服务器在YourKit不能做的时候做了什么吗?如果它很重要,服务器机器正在运行Ubuntu 10.04,和

$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.10) (rhel-1.28.1.10.10.el5_8-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
Run Code Online (Sandbox Code Playgroud)

dur*_*597 3

好吧,从评论中我可以清楚地看出,我们无法根据您迄今为止提供的信息来解决这个问题。我们能做的最好的事情就是提供有关如何调试它的建议......

我会尝试在其中一个峰值期间使用jstack,看看是否可以使用它来找出它挂在哪里。