【问题标题】:Tomcat: SEVERE: All threads (200) are currently busyTomcat:严重:所有线程(200)当前都很忙
【发布时间】:2015-04-10 15:45:22
【问题描述】:

我们偶尔会得到

Mar 31, 2015 7:24:32 PM org.apache.tomcat.util.threads.ThreadPool logFull
SEVERE: All threads (200) are currently busy, waiting. Increase maxThreads (200) or check the servlet status

在 Catalina 日志中,服务器停止响应。服务器使用非常少,并发用户数不到 200(繁忙的一天 2-3 个)

线程转储显示了其中的 199 个:

"TP-Processor200" daemon prio=10 tid=0x00002b513c31b000 nid=0x1c44 runnable [0x00002b514a9a7000]
java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    - locked <0x00000007873208a0> (a java.io.BufferedInputStream)
    at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:628)
    at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:566)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:693)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    at java.lang.Thread.run(Thread.java:662)

其中之一

"TP-Processor4" daemon prio=10 tid=0x00002b513c21a000 nid=0x7470 in Object.wait() [0x00002b5135520000]
java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x0000000784a7a208> (a org.apache.tomcat.util.threads.ThreadPool)
    at java.lang.Object.wait(Object.java:485)
    at org.apache.tomcat.util.threads.ThreadPool.findControlRunnable(ThreadPool.java:339)
    - locked <0x0000000784a7a208> (a org.apache.tomcat.util.threads.ThreadPool)
    at org.apache.tomcat.util.threads.ThreadPool.runIt(ThreadPool.java:314)
    at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:676)
    at org.apache.jk.common.ChannelSocket$SocketAcceptor.runIt(ChannelSocket.java:879)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    at java.lang.Thread.run(Thread.java:662)

任何人都可以弄清楚为什么它抱怨繁忙的线程而显然不是吗?

【问题讨论】:

    标签: tomcat6


    【解决方案1】:

    首先,InputStream 方法在与套接字(即 SocketInputStream)一起使用时 - 默认情况下会阻塞“直到接收到数据、检测到流的结尾或抛出异常”。可以使用 setSoTimeout 设置超时值,以将读取阻塞限制为 x 毫秒,达到该值时将抛出 SocketTimeoutException。

    可以关闭在另一个线程中被阻塞读取的套接字以进行输入,然后应向读取线程发出信号以关闭套接字并退出。

    这可以通过在套接字上使用 shutdownInput 方法来完成:

    //Shutting down input to socket...
    socket.shutdownInput(); 
    

    然后,您仍然可以使用以下命令发送到输出套接字:

    //Write to socket again 
    toSocket.print("is socket connection still available?\r\n"); 
    //close socket 
    socket.close(); 
    

    还取决于用于传递流的任何“设备”...即如果它类似于容器或 COM 端口,则此行为可能会根据实现或供应商规范而有所不同...如果是这种情况,您可能会查看此处提供的一些建议:Java InputStream blocking read - 并且可能建议使用 DataInputStream 包装输入以使事物的行为具有更多“类似文件”的一致性,即确保在未收到任何内容时抛出 EOFException。

    还有一个选择可能是切换到像 NIO 这样的非阻塞连接器实现 - 在连接空闲期间线程不会被阻塞,而是由用于限制过度消耗的特殊“轮询”线程监视线程池中的“正常”线程。

    关于 NIO 和线程争用的一些有用信息也可以在这里找到:http://tutorials.jenkov.com/java-nio/server-socket-channel.html

    【讨论】:

      猜你喜欢
      • 2012-08-15
      • 1970-01-01
      • 2017-09-16
      • 2018-12-03
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      相关资源
      最近更新 更多