Performance HornetQ吞吐量限制为4000 TPS,无持久性

Performance HornetQ吞吐量限制为4000 TPS,无持久性,performance,jboss,jboss6.x,hornetq,throughput,Performance,Jboss,Jboss6.x,Hornetq,Throughput,我正在使用JBoss6.1应用服务器中嵌入的HornetQ。 我的应用程序(一个产生消息的客户端应用程序,以及使用它们的JBoss应用程序)无法在CPU仍有60%空闲的情况下在服务器上处理4000多个TPS。我试图删除持久性以检查我是否被磁盘绑定,但这并没有提高吞吐量 看来问题出在制片人方面。至少在监控队列大小时,它保持非常小,这意味着消费者不是瓶颈 我应该使用多个队列来提高效率吗?我已经阅读了HornetQ的性能调优文档,但找不到原因。 或者可能是因为我正在使用自动确认模式?我正在为制作人运行

我正在使用JBoss6.1应用服务器中嵌入的HornetQ。 我的应用程序(一个产生消息的客户端应用程序,以及使用它们的JBoss应用程序)无法在CPU仍有60%空闲的情况下在服务器上处理4000多个TPS。我试图删除持久性以检查我是否被磁盘绑定,但这并没有提高吞吐量

看来问题出在制片人方面。至少在监控队列大小时,它保持非常小,这意味着消费者不是瓶颈

我应该使用多个队列来提高效率吗?我已经阅读了HornetQ的性能调优文档,但找不到原因。 或者可能是因为我正在使用自动确认模式?我正在为制作人运行几个线程,以确保这不会产生太大影响。生产者JVM无论如何不能使用超过1个CPU线程。我甚至试着运行我的producer应用程序的几个实例,但速度并没有加快。 网络带宽很高(1 Gbps),我的消息非常小(<1 KB)。 另外,生产者和消费者应用程序运行在同一台服务器上。
HornetQ配置在一个由2台服务器组成的JBoss集群中。

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

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

1000
...
此参数限制每个客户端的未完成消息。它不适用于单个生产者线程,而是适用于所有组合的线程,因此,如果达到该限制,添加线程将没有帮助。网络往返延迟会使您很快到达

见:

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

您可以尝试2.3.0。我已经移除了一些将消息附加到队列的锁。也许它会在2.3.0.Final上扩展为一个队列


(在我写这篇文章时,2.3.0.Final即将发布。2.3.0.CR2没有我所说的更改)

谢谢你的建议。我试过了,但没有改变任何事情。我尝试了所有其他性能参数,但没有成功。我最终通过使用几个队列提高了性能。看起来HornetQ在一个队列上有争用,阻止超过4000 TPS。