我编写的服务器偶尔会出现问题。它在 Clojure 中,但我认为这并不重要,我们可以假装它在 Java 中。无论如何,它一次可以正常工作几个小时,但会在表现非常糟糕的地方出现:所有活动停止,大约十五秒钟,然后它正常工作几秒钟,然后停止十五秒钟......所以(通常)大约十分钟左右,之后它会恢复正常行为。
我已经使用 YourKit 对其进行了很多分析,并排除了一些可能的嫌疑人:
这不是垃圾收集问题:我正在使用 运行它
-XX:+UseConcMarkSweepGC
,并且我已验证服务器在次要和主要收集期间继续运行良好,这是由于此垃圾收集器的并发性质。而且我们不会因为总内存或其他东西用完而崩溃:当前的堆大小远低于其最大值。我不认为这是一个锁定/同步问题,但我对此不是 100% 确定的。YourKit 分析器有时会显示线程等待,例如争夺 System.out 的锁以生成日志消息,但唯一的长时间等待是线程池中的工作线程在无事可做时。当然,YourKit 说它从未检测到任何死锁。
这不是由于附加了探查器而引起的,因为即使我启动服务器然后不理会它而没有附加探查器,它仍然会发生。
占用所有 CPU 时间的不是系统上的其他进程:
top
显示我的 java 进程的 CPU 使用率为 100%,其他所有进程基本上为 0%。
我最大的问题是在这些奇怪的恐惧期间我看不到服务器在做什么,因为分析器停止接收样本。下面是 CPU 使用率图表:
图的左侧是正常操作,在此期间我们每秒左右获取分析器样本。右侧是“损坏的”,并且非常尖,因为分析器每十秒左右才获取样本。在它得到的样本中,服务器似乎在做它平常的事情:响应请求等等;并且日志确认它正在做正常的事情,但仅在分析器有样本时: 在图表上向上倾斜的“直线”期间,分析器没有样本,服务器什么也不做.
那么,这个图表对任何人来说都很熟悉吗?你以前有过这个问题并解决了吗?或者您能否指出一个工具的方向,该工具可以在 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)