处于等待状态的Apache Tomcat线程具有100%的CPU利用率

M.N*_*M.N 5 apache tomcat tomcat6

有时,应用程序在承受负载时使用100%.

做一个kill -quit <pid>等待状态显示1100+螺纹:

Full thread dump Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode):

"http-8080-1198" daemon prio=10 tid=0x00007f17b465c800 nid=0x2061 in Object.wait() [0x00007f1762b6e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00007f17cb087890> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at java.lang.Object.wait(Object.java:485)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
        - locked <0x00007f17cb087890> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
        at java.lang.Thread.run(Thread.java:619)

"http-8080-1197" daemon prio=10 tid=0x00007f17b465a800 nid=0x2060 in Object.wait() [0x00007f1762c6f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00007f17cb14f460> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at java.lang.Object.wait(Object.java:485)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
        - locked <0x00007f17cb14f460> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
        at java.lang.Thread.run(Thread.java:619)
............
Run Code Online (Sandbox Code Playgroud)

即使取消部署应用程序上下文或重新启动数据库,状态也不会更改.

请提出可能的原因.

App Server:Apache Tomcat 6.0.26

最大线程数:1500

处于WAITING状态的线程:1138

Jos*_*seK 4

“等待不是问题。线程正在等待通知 - 在本例中它被锁定在 JIOEndpoint.Worker

后台线程侦听传入的 TCP/IP 连接并将它们移交给适当的处理器。

所以我认为这是在等待实际请求的到来。

首先,当你有很多线程时,由于大量的上下文切换, CPU 利用率实际上会增加。你真的需要1500吗?你可以尝试减少吗?

其次,是否占用内存或 GC 过于频繁?

如果你看到这些, “等待就会成为一个问题。您在堆栈跟踪中是否有任何 BLOCKED(在对象监视器上)或等待锁定()?

  • @Mohit:负载测试是正确的方法。这取决于每个用户每个请求需要多长时间以及他们通常会执行哪些处理。http://people.apache.org/~mturk/docs/article/ftwai.html 说*要充分利用 Tomcat,您应该将每个 CPU 的并发请求数限制为 200 个。* (3认同)