3

我正在使用嵌入在 JBoss 6.1 应用服务器中的 HornetQ。我的应用程序(一个客户端应用程序,产生消息,以及使用它们的 JBoss 应用程序)在 CPU 仍处于 60% 空闲状态时无法在服务器上处理超过 4000 TPS。我试图删除持久性以检查我是否受磁盘限制,但它并没有提高吞吐量。

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

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

4

3 回答 3

6

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

于 2013-04-23T12:21:09.073 回答
3

您也许可以尝试 2.3.0。我已经删除了一些将消息附加到队列的锁定。也许它会在 2.3.0.Final 上使用单个队列进行扩展。

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

于 2013-04-23T16:06:28.117 回答
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

于 2013-04-20T15:47:20.303 回答