HornetQ消费者在Linux高CPU负载

时间:2013-01-24 19:01:19

标签: java jms netty nio hornetq

我们在CentOS 6.3上使用HornetQ 2.2.14。我们的appservers中遇到了CPU使用率过高的问题,并且使用分析器将其缩小到我们的HornetQ消费者。

具体来说,我们在大约150名消费者的空队列中快速连续调用此方法:

// Called about every 10ms per consumer.
javax.jms.MessageConsumer.receive(10);

这导致大约2个NIO工作线程追溯到Netty,在我们空闲的Tomcat实例上消耗了大约50%的2个CPU核心。

  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

以下是我测试的两个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)

2 个答案:

答案 0 :(得分:2)

IMO你应该使用MessageListener ..或者只是阻止一段时间,比如10秒......

...反复10毫秒是你系统的巨大爆发。特别是客户端每次都会向服务器发送回调。

让邮件系统为您完成工作,即在邮件到达时让它给您打电话。如果你每隔10毫秒轮询一次系统,就不能指望任何其他东西。

这是你的问题的罪魁祸首,正如你自己所说:

consumer.receive(10);

算一算,每个使用此接收器(10)敲击服务器的消费者正在使服务器每位消费者每秒发送100条消息说...我是空的。

接收方(10)将进行往返以确保传输中没有消息。所以,你用空信息锤击服务器。

根据您强制使用的参数,您的应用程序不应该运行良好。对于任何保证你接收的消息解决方案(10)在返回null之前都是空的。

答案 1 :(得分:1)

虽然克莱伯特的回答有点难以接受,但这最终是一个有效的案例。您可以轻松创建多个消息侦听器,这些侦听器将充当您的工作者并允许JMS提供程序调用它们。假设您的目标是某种类型的队列,将使用相当分布的负载调用消息侦听器,以允许多个线程处理该处理。创建消息侦听器将允许JMS提供程序在消息到达时调用它们,而不是等待客户端使用该消息。

每次调用接收方法时,它都会按照Clebert描述的方式行事(他应该知道,他是HornetQ的领导者)。

我不确定是什么版本的Netty HornetQ 2.2.14,但我确实在github上找到了一些与他们非常相似的回购相关的问题。也许您可以尝试在应用程序中更新Netty的版本以查看是否有帮助?

https://github.com/netty/netty/issues/592

https://github.com/netty/netty/issues/582