野蝇 29|当繁忙任务计数线程数达到最大 io 线程数时,CPU 使用率较高

Wildfly 29| High CPU utilization when busy task count thread reaches the max io thread count

提问人:Yashaswini Adiga 提问时间:11/3/2023 更新时间:11/3/2023 访问量:12

问:

我们在使用 JMS 队列的应用程序时遇到了问题。

我们在队列中收到一条消息 -> triggers onMessage of MDB -> 通过 http 调用 SOAP API(同时定时等待消费者正在等待响应队列上的响应)->response 被写入响应队列。

我们正在进行负载测试,我们观察到的一种模式是,当我们后端的响应时间很高(soap api)时,默认的io线程会不断达到预期的阈值,这是由于响应缓慢而产生的。然而,我们看到 CPU 出现了巨大的飙升(几乎有 8 个内核被占用)。一旦我们的后端开始更好地响应,峰值就会下降(繁忙的任务线程计数也会下降)

当我们将线程转储与高 CPU 使用率和最佳 CPU 使用率进行比较时,我们看到许多阻塞的线程(大约 190 个)正在等待由 TIMED-WAIT(Parked) 线程获取的锁。

阻塞线程示例:(其他 189 个线程也被阻塞,等待相同的锁)

“默认任务-1625” #3232 prio=5 os_prio=0 cpu=18990.56ms 经过=1343.16s tid=0x00005575bffd9800 nid=0x51f8等待监视器条目 [0x00007f3207a58000] java.lang.Thread.State:BLOCKED(在对象监视器上) 在 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:860) - 等待锁定<0x00000006acbc36f0> (org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory) 在 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createQueueConnection(ActiveMQConnectionFactory.java:335) 在 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createQueueConnection(ActiveMQConnectionFactory.java:331)

上面的锁由以下线程拥有

“默认任务-2096” #3773 prio=5 os_prio=0 cpu=1309.26ms 经过=149.43s tid=0x00005575c71ac000 nid=0x1b82等待条件 [0x00007f321d487000] java.lang.Thread.State:TIMED_WAITING(停车) 在 jdk.internal.misc.Unsafe.park([email protected]/Native Method) - 停车等待<0x000000079cfd9fd0> (java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 在java.util.concurrent.locks.LockSupport.parkNanos([email protected]/LockSupport.java:234) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:2211) 在org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:518) - 锁定<0x000000079cfda010> (java.lang.Object) 在 org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:446) 在 org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQClientProtocolManager.createSessionContext(ActiveMQClientProtocolManager.java:306) 在 org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQClientProtocolManager.createSessionContext(ActiveMQClientProtocolManager.java:254) 在 org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl.createSessionChannel(ClientSessionFactoryImpl.java:1419) - 锁定<0x000000079cfd7608> (java.lang.Object) 在 org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl.createSessionInternal(ClientSessionFactoryImpl.java:736) 在 org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl.createSession(ClientSessionFactoryImpl.java:317) 在 org.apache.activemq.artemis.jms.client.ActiveMQConnection.authorize(ActiveMQConnection.java:650) 在 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:901) - 锁定<0x00000006acbc36f0> (org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory) 在 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createQueueConnection(ActiveMQConnectionFactory.java:335)

我们的默认 IO 线程配置:

<worker name=“default” io-threads=“200” task-max-threads=“200”/>

我正在寻找有关为什么当繁忙的任务线程数达到 200 时 CPU 会上升的见解。

TIA系列

在此处输入图像描述

在 CPU 峰值期间进行的线程转储中,有线程块,理想情况下,我们希望它不会消耗 CPU。

io wildfly CPU使用率

评论


答: 暂无答案