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

标签 java performance clojure profiling yourkit

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

我已经用 YourKit 对它做了很多分析,并且排除了一些似是而非的嫌疑:

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

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

  • 这不是附加分析器造成的,因为即使我启动服务器然后不附加分析器,它仍然会发生。

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

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

YourKit CPU-graph screenshot

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

那么,这张图大家是不是很眼熟?你以前遇到过这个问题并解决了吗?或者你能给我指出一个工具的方向,它可以在 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)

最佳答案

好的,根据评论,我似乎很清楚,我们无法根据您目前提供的信息来解决这个问题。我们最多只能提供有关如何调试它的建议...

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

关于java - 当探查器无法收集样本时,如何调试无响应的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16347154/

相关文章:

java - 使用 CDI (Seam 3) View 范围时的 JSF 转换器范围

java - 如何只获得类型为 XMLGregorianCalendar 的年份

javascript - .prop() VS .val() .使用 jQuery 设置输入文本值

sql - 为什么 Oracle 使用 ORDER BY 忽略索引?

list - 如何在 Clojure 中将 '( ' (...) '(...) ... ) 转换为 [...] [...] ... ]?

clojure - clojure/clojurescript 形式中的通用 CRUD 有什么东西吗

clojure - Clojure 表单中嵌入最多的列表

java - 更改 Axis Web 服务 URL

c# - 预加载 WPF 窗口(可能在其他线程中)以提高性能

java - 将图像加载到 GridView 时出现 OutOfMemoryError