【问题标题】:Jetty rejects connection even when there are lot of free threads available in thread pool即使线程池中有大量可用线程,Jetty 也会拒绝连接
【发布时间】:2021-05-28 02:13:54
【问题描述】:

在生产中,我们使用的是 jetty 9.2.9.v20150224,配置如下:

 new Server(new QueuedThreadPool(200, 5, 30000, new ArrayBlockingQueue<Runnable>(128)));

maxThreads = 200,minThreads = 5,idleTimout = 30000 毫秒

我测试了我们的应用程序,它能够处理 200 个请求/秒,但很少有客户抱怨有时即使负载非常少,码头也不接受任何新连接,而从日志中我发现 STARTED ,5。据我了解,线程池中有 18 个活动线程,远少于 200 个,但不知何故,新连接仍然被拒绝。以下是从日志中截取的:

2021-01-08 00:20:47,813 WARN [qtp1720926658-14444] QueuedThreadPool :     QueuedThreadPool[qtp1720926658]@669341c2{STARTED,5<=18<=200,i=4,q=128}[ReservedThreadExecutor@58a5954d{s=3/4,p=1}] rejected org.eclipse.jetty.io.ManagedSelector$DestroyEndPoint@263c181
2021-01-08 00:20:47,813 WARN [qtp1720926658-14444] QueuedThreadPool : QueuedThreadPool[qtp1720926658]@669341c2{STARTED,5<=18<=200,i=3,q=128}[ReservedThreadExecutor@58a5954d{s=3/4,p=1}] rejected org.eclipse.jetty.io.ManagedSelector$DestroyEndPoint@431081c5
2021-01-08 00:20:47,813 WARN [qtp1720926658-14445] QueuedThreadPool : QueuedThreadPool[qtp1720926658]@669341c2{STARTED,5<=18<=200,i=2,q=128}[ReservedThreadExecutor@58a5954d{s=3/4,p=1}] rejected org.eclipse.jetty.io.ManagedSelector$DestroyEndPoint@3866d8cd
2021-01-08 00:20:47,813 WARN [qtp1720926658-14442] QueuedThreadPool : QueuedThreadPool[qtp1720926658]@669341c2{STARTED,5<=18<=200,i=6,q=126}[ReservedThreadExecutor@58a5954d{s=1/4,p=2}] rejected CEP:SocketChannelEndPoint@4aa81d65{/10.0.1.29:53143<->/10.0.1.28:7777,OPEN,fill=FI,flush=-,to=16442/30000}{io=1/0,kio=1,kro=1}->HttpConnection@32cdb0b1[p=HttpParser{s=START,0 of -1},g=HttpGenerator@22c521c0{s=START}]=>HttpChannelOverHttp@e02e50f{r=1,c=false,a=IDLE,uri=null,age=0}:runFillable:BLOCKING
2021-01-08 00:20:47,829 WARN [qtp1720926658-14442] EatWhatYouKill :
java.util.concurrent.RejectedExecutionException: CEP:SocketChannelEndPoint@4aa81d65{/10.0.1.29:53143<->/10.0.1.28:7777,OPEN,fill=FI,flush=-,to=16442/30000}{io=1/0,kio=1,kro=1}->HttpConnection@32cdb0b1[p=HttpParser{s=START,0 of -1},g=HttpGenerator@22c521c0{s=START}]=>HttpChannelOverHttp@e02e50f{r=1,c=false,a=IDLE,uri=null,age=0}:runFillable:BLOCKING
at org.eclipse.jetty.util.thread.QueuedThreadPool.execute(QueuedThreadPool.java:440)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.execute(EatWhatYouKill.java:370)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:305)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:762)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:680)
at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

标签: jetty jetty-9


【解决方案1】:

STARTED,5&lt;=18&lt;=200,i=4,q=128 说...

  • 5 是您配置的最小线程数
  • &lt;=18&lt;= 是池中剩余的可用线程
  • 200 是您配置的最大线程数
  • i=4 池中有 4 个空闲线程(符合清理/删除条件)
  • q=128你有 128 个任务/作业在队列中(这个值太高,它暗示你的 QTP 配置不足以满足你的负载)

请记住,当您遇到被拒绝的任务/作业时,可能是队列或池拒绝它们,我们不知道 Jetty 9.2.x 中的哪一个(此信息现在可在 Jetty 的日志中找到9.4.x)

Jetty 9.2.x 系列中 QTP 的这种有限视图甚至没有向您展示内部发生的事情的一半。

示例:在 Jetty 9.4.x+ 中,您会看到 ...

  • 配置的最小值
  • 配置的最大值
  • 空闲线程数
  • 活动线程数
  • 忙线程数
  • 非活动线程数
  • 保留线程数
  • 租用线程数
  • 已用计数 = 线程 - 空闲 - 保留 - 已租用
  • 可能的最大线程数 = 非活动 + 空闲 + 保留 + 租用 + 已使用
  • 线程总数 = 空闲 + 保留 + 租用 + 已使用
  • 忙线程 = 已租用 + 已使用
  • 就绪线程 = 空闲 + 保留
  • 可用 = 最大 - 忙碌
  • maxAvailable = max - 租用
  • utilization = used / maxAvailable(0.0 表示空闲,1.0 表示满负荷)

所有这些都在 JMX 中公开。

【讨论】:

  • 您好 Joakim,感谢您的回答。我可以配置码头的最高配置是什么。我们的应用程序在具有 8 GB RAM 的 4 核机器上运行。有了这个负载,资源使用率不会超过 30%。对于这个硬件,码头的正确数字是多少。
  • 您需要的配置首先基于您的应用程序的行为。我在使用中看到的最高配置是 min=4096,max=32768(但那是在具有 100 多个内核和 2TB 内存的 azul 计算设备上,应用程序专注于超快速休息调用,总响应时间低于 70 毫秒)
猜你喜欢
  • 1970-01-01
  • 2016-04-10
  • 2018-06-28
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2019-07-07
  • 2014-08-22
相关资源
最近更新 更多