HornetQ吞吐量限制在4000 TPS而没有持久性

时间:2013-04-19 11:19:50

标签: performance jboss jboss6.x hornetq throughput

我在JBoss 6.1应用服务器中使用HornetQ。 我的应用程序(一个客户端应用程序,生成消息,以及消耗它们的JBoss应用程序)无法在服务器上处理超过4000 TPS,而CPU仍然是60%空闲。我试图删除持久性以检查我是否是磁盘绑定但它没有提高吞吐量。

似乎问题出在生产者方面。至少在监控队列大小时,它仍然非常小,这意味着消费者不是瓶颈。

我应该使用多个队列来提高效率吗?我已经阅读过HornetQ的性能调优文档,但找不到原因。 或者可能是因为我使用的是AUTO_ACKNOWLEDGE模式?我正在为生产者运行几个线程,这不应该影响很多。生产者JVM无论如何都不能使用超过1个CPU线程。我甚至试图运行我的生产者应用程序的几个实例,但它不会更快。 网络带宽很高(1 Gbps),我的消息非常小(<1 KB)。 此外,生产者和消费者应用程序在同一服务器上运行。 HornetQ在两台服务器的JBoss集群中配置。

3 个答案:

答案 0 :(得分:6)

我能够通过使用几个队列来解决这个问题。通过使用JProfiler,我可以看到我的队列上的锁定,所有线程都在等待这些锁定。 我尝试了2个队列,我可以将性能提高一倍。所以现在我正在建立一组队列。

答案 1 :(得分:3)

你可以试试2.3.0。我在将消息附加到队列时删除了一些锁。也许它会扩大到2.3.0.Final上的单个队列。

(在我写这篇文章的时候,2.3.0.Final即将发布.2.3.0.CR2没有我正在谈论的这个改变)

答案 2 :(得分:2)

您是否增加了客户端的发送窗口大小?

<connection-factory name="ConnectionFactory">
  <producer-window-size>1000</producer-window-size>
...

此参数限制每个客户端的未完成消息。它不适用于单个生产者线程,但适用于所有组合,因此如果达到该限制,添加线程将无济于事。网络往返延迟使您很快就能达到目标。

请参阅: http://docs.jboss.org/hornetq/2.2.14.Final/user-manual/en/html/flow-control.html#d0e4005