6

我编写的服务器偶尔会出现问题。它在 Clojure 中,但我认为这并不重要,我们可以假装它在 Java 中。无论如何,它一次可以正常工作几个小时,但会在表现非常糟糕的地方出现:所有活动停止,大约十五秒钟,然后它正常工作几秒钟,然后停止十五秒钟......所以(通常)大约十分钟左右,之后它会恢复正常行为。

我已经使用 YourKit 对其进行了很多分析,并排除了一些可能的嫌疑人:

  • 这不是垃圾收集问题:我正在使用 运行它-XX:+UseConcMarkSweepGC,并且我已验证服务器在次要和主要收集期间继续运行良好,这是由于此垃圾收集器的并发性质。而且我们不会因为总内存或其他东西用完而崩溃:当前的堆大小远低于其最大值。

  • 我不认为这是一个锁定/同步问题,但我对此不是 100% 确定的。YourKit 分析器有时会显示线程等待,例如争夺 System.out 的锁以生成日志消息,但唯一的长时间等待是线程池中的工作线程在无事可做时。当然,YourKit 说它从未检测到任何死锁。

  • 这不是由于附加了探查器而引起的,因为即使我启动服务器然后不理会它而没有附加探查器,它仍然会发生。

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

我最大的问题是在这些奇怪的恐惧期间我看不到服务器在做什么,因为分析器停止接收样本。下面是 CPU 使用率图表:

YourKit CPU-graph 截图

图的左侧是正常操作,在此期间我们每秒左右获取分析器样本。右侧是“损坏的”,并且非常尖,因为分析器每十秒左右才获取样本。在它得到的样本中,服务器似乎在做它平常的事情:响应请求等等;并且日志确认它正在做正常的事情,但仅在分析器有样本时: 在图表上向上倾斜的“直线”期间,分析器没有样本,服务器什么也不做.

那么,这个图表对任何人来说都很熟悉吗?你以前有过这个问题并解决了吗?或者您能否指出一个工具的方向,该工具可以在 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)
4

3 回答 3

3

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

我会尝试在其中一个尖峰期间使用jstack,看看你是否可以用它来确定它挂在哪里。

于 2013-05-02T21:11:41.987 回答
1

你以前有过这个问题并解决了吗?或者您能否指出一个工具的方向,该工具可以在 YourKit 无法确定我的服务器在做什么时?

如果您在服务器上具有 shell 访问权限并且可以看到标准输出,请尝试在服务器无响应时进行线程转储。不确定这是否会给您带来与 jstack (在另一个答案中提到)给您的不同的东西。

在 Ubuntu 上:(kill -QUIT <java-pid>实际上不会杀死 Java 进程)。

http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx

于 2013-05-03T14:26:12.273 回答
1

如果您没有机会在代码中测量或调试,请尝试从外部查看。

我首先会尝试重现该问题。换句话说,是否存在产生行为的外部事件。尝试更改服务器上的负载。尽可能切换一切以重现问题。

也许在服务器挂起时嗅探网络流量(tcpdump)以找到有趣的东西也是一个好主意。

您也可以在另一个操作系统上运行它,以检查它是否依赖于您的安装环境。

如果您无法重现出现问题的情况,请尝试查找您没有遇到问题的情况。例如从网络中删除服务器。关闭所有其他服务。

如果您无法找到程序行为的任何变化,请尝试降低工作代码的复杂性,并查看是否可以找到似乎与问题相关的内部模块。

于 2013-05-03T14:05:40.587 回答