我們在CentOS 6.3上使用HornetQ 2.2.14。我們一直在遇到我們的應用服務器CPU使用率高的問題,並使用分析器將其縮小到我們的HornetQ消費者。Linux上的HornetQ消費者高CPU負載
具體而言,我們要求在空隊列快速連續此方法用約150消費者:
// Called about every 10ms per consumer.
javax.jms.MessageConsumer.receive(10);
這導致約2 NIO工作線程追溯Netty的,消耗2個的CPU核心50%左右,在我們空閒的Tomcat實例上。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21939 tomcat 20 0 9061m 1.6g 16m R 55.4 21.2 1:06.88 java
21777 tomcat 20 0 9061m 1.6g 16m S 47.6 21.2 1:29.40 java
21777 tomcat 20 0 9061m 1.6g 16m S 7.3 21.2 1:33.41 java
21763 tomcat 20 0 9061m 1.6g 16m S 6.6 21.2 1:28.84 java
21682 tomcat 20 0 9061m 1.6g 16m S 4.3 21.2 0:26.70 java
問題是,使用完全相同的代碼和Windows上的Tomcat配置,CPU內核處於空閒狀態。這導致我相信這是一個Linux/Netty/HornetQ問題。有沒有其他人看過這個,如果是的話,我該如何讓它消失?
Linux版本:CentOS的6.3 x64的 的Linux內核版本:Linux版本的2.6.32-279.19.1.el6.x86_64
這裏是2個的Java版本我有同樣的結果進行測試:
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)
忘了補充,這裏有由簡標識的熱點: org.hornetq.core.client.impl.ClientConsumerImpl.receive()和 org.jboss.netty .channel.socket.nio.SelectorUtil.select() – Nobody
通過切換HornetQ以使用阻塞IO沒有任何影響。現在不是2個使用CPU的NIO工作線程,而是使用2個阻塞IO工作線程消耗相同數量的CPU。一個客戶端線程和一個服務器線程。 – Nobody
如果將超時值增加到30ms,會發生什麼情況。我問,因爲如果超時值接近實時時鐘的分辨率,可能會出現意想不到的事情,並且我記得時鐘在10ms左右的時候正常工作。 – parsifal