0

ubuntu,11.04,11.10。tomcat 7.0.25-7.0.28,jdk sun 1.6_30 - 1.6_33。

解压,删除 webapp 文件夹。在 catalina 启动后 top 显示在 1cpu x64 4 核上 tomcat 占用了 170% 的 CPU。在 2cpu x64 4core 上显示高达 400%。

tomcat 中没有安装任何应用程序。试图找出消耗 CPU 的线程 - 下面是 5 个顶级线程:

"VM Periodic Task Thread" prio=10 tid=0x0000000040a7f000 nid=0x166c waiting on condition

"ajp-bio-8009-AsyncTimeout" daemon prio=10 tid=0x00007feaf0666800 nid=0x16ad sleeping[0x00007feafe011000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:148)
        at java.lang.Thread.run(Thread.java:662)

"http-bio-8080-AsyncTimeout" daemon prio=10 tid=0x000000004204f800 nid=0x16ab waiting on condition [0x00007feafead1000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:148)
        at java.lang.Thread.run(Thread.java:662)

"ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon prio=10 tid=0x0000000041d1b800 nid=0x16a9 sleeping[0x00007feafe405000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1517)
        at java.lang.Thread.run(Thread.java:662)

"VM Thread" prio=10 tid=0x0000000040a39000 nid=0x1665 runnable

看起来没什么有趣的。所以,我被困住了。有谁知道去哪里更进一步?还有一件事:有几个设置几乎相同的虚拟盒子 - 从来没有看到如此巨大的 CPU 消耗。

4

2 回答 2

1

我在java“VM Periodic Task Thread”中遇到了同样的cpu使用率高的问题。

问题的原因最终归结为闰秒的 linux 问题,详见这篇博文:java 闰秒错误 – 2012 年 6 月 30 日/7 月 1 日 – 修复

按照那里列出的步骤(停止 ntpd、重置日期、重新启动 ntpd)为我解决了 CPU 使用率高的问题。

于 2012-10-01T23:59:11.620 回答
1

处于状态的线程TIMED_WAITING不需要 CPU 周期。只要所有线程都处于这种状态,Tomcat就不可能是负载的原因。

你还能做什么?

  1. 在分析器中运行 Tomcat。与线程转储(仅显示当前状态)不同,分析器将收集分析信息。这将允许您查看哪些方法使用了多少时间。

  2. 在 webapp 文件夹中至少保留一个应用程序。我不确定Tomcat在找不到任何事情可做时会做什么。

  3. 检查 Tomcat 是否像您认为的那样查看 webapp 文件夹。也许环境变量会影响这一点。

  4. 这可能是因为 Tomcat 正在启动。不太可能,但也许等待几分钟可能会有所帮助。

  5. 你还剩多少内存?也不太可能,因为这会产生巨大的负载,但 CPU 会非常空闲。

于 2012-07-06T12:01:30.210 回答