【问题标题】:Tomcat: Cannot put items on the request queueTomcat:无法将项目放入请求队列
【发布时间】:2019-06-21 01:23:24
【问题描述】:

我们有一个在 Tomcat (8.0.32) 上运行的 Java 应用程序,它会间歇性地停止处理请求。 CPU 做的很少,线程转储显示没有很多正在运行的线程和大量正在等待的线程(主要看起来像 Tomcat 中的排队线程)。

在我看来,Tomcat 工作人员和客户端轮询器已被卡住,但很可能/很可能我误读了线程转储。我有一个 clientPoller 似乎在等待锁定,同时提供到队列的连接。同一个锁阻止任何工作人员从队列中获取任何内容。我们看不到任何线程导致锁定。下面是 ClientPoller + 一个工人的堆栈跟踪(许多工人具有相同的堆栈跟踪):

"http-nio-8888-ClientPoller-1" #42 daemon prio=5 os_prio=0 tid=0x00007efc9cb86800 nid=0x3367 waiting on condition [0x00007efc5f5f4000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000821e3940> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
    at java.util.concurrent.LinkedBlockingQueue.signalNotEmpty(LinkedBlockingQueue.java:172)
    at java.util.concurrent.LinkedBlockingQueue.offer(LinkedBlockingQueue.java:430)
    at org.apache.tomcat.util.threads.TaskQueue.offer(TaskQueue.java:74)
    at org.apache.tomcat.util.threads.TaskQueue.offer(TaskQueue.java:31)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1361)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:163)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:141)
    at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:934)
    at org.apache.tomcat.util.net.NioEndpoint$Poller.processKey(NioEndpoint.java:834)
    at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:810)
    at java.lang.Thread.run(Thread.java:745)
"http-nio-8888-exec-1" #46 daemon prio=1 os_prio=0 tid=0x00007efbb8002000 nid=0x336a waiting on condition [0x00007efc5f2f1000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000821e3940> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2083)
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

问题:

  • ClientPoller-1 的情况真的正常吗?还是说明有问题?在我看来,当宣布队列不为空时,它似乎被卡住了。
  • 这种情况是否会敲响警钟?

如有必要,很乐意上传整个线程转储并提供任何其他信息。

【问题讨论】:

    标签: java coldfusion tomcat8 lucee


    【解决方案1】:

    不再支持 Tomcat 8.0.x。如果它尚未在您的 TODO 列表中,您应该添加升级到 8.5.x 或 9.0.x - 理想情况下是两者的最新可用版本。

    最好的猜测是 OutOfMemoryError 杀死一个线程,同时它持有其他线程正在等待的锁。理论上,锁应该已经被释放,但是一旦发生 OOME,就无法保证。在此问题发生之前的某个时间,我会检查您的日志中是否存在 OOME。如果它是 OOME,您可能需要运行分析器来检查一段时间内的内存使用情况,以防您的应用程序需要更大的堆。

    【讨论】:

    • 谢谢马克,这听起来很合理。您是否知道除 OOME 之外会导致类似行为的任何其他线程错误(将检查,但内存使用情况似乎相当稳定)。
    猜你喜欢
    • 2023-04-04
    • 2016-05-19
    • 2018-08-12
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多