【问题标题】:HornetQ performance profilingHornetQ 性能分析
【发布时间】:2014-03-20 12:25:37
【问题描述】:

我正在使用 hornetq-core-client api 2.4.0.Final,使用此代码添加消息:

            ClientMessage clientMessage = _producerClientSession.createMessage(true);
            clientMessage.putStringProperty(MESSAGE_KEY, message);
            _clientProducer.send(clientMessage);

我正在重用文档中提到的 ClientSession 和 ClientProducer。在分析期间,我们看到这平均需要 400 多毫秒。这看起来对吗?似乎很慢。我们还安装了 AIO 并在 ubuntu 上运行。

编辑: 这是“iostat -d -x 1”的输出,而排队平均需要 600 毫秒

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00  596.00     0.00  2568.00     8.62     1.20    2.01    0.00    2.01   0.04   2.40

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00    44.00    0.00  611.00     0.00 12904.00    42.24     0.10    0.17    0.00    0.17   0.05   2.80

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00  642.00     0.00  2916.00     9.08     0.02    0.03    0.00    0.03   0.03   2.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00  648.00     0.00  2900.00     8.95     0.03    0.04    0.00    0.04   0.04   2.80

编辑 #2 我们更新了配置以包括:

    Configuration configuration = new ConfigurationImpl();
    configuration.setPersistenceEnabled(true);
    configuration.setJournalSyncTransactional(false);

对于创建 ClientSessionFactory 来:

ClientSessionFactory sf = null;
  try {
    hornetQServer.start();
    ServerLocator serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName()));
    serverLocator.setBlockOnDurableSend(false);
    serverLocator.setProducerWindowSize(100000);

    serverLocator.setBlockOnAcknowledge(false);
    ClientSessionFactory sf = serverLocator.createSessionFactory();

发送时间现在不到一毫秒。这些设置是否不安全,或者不推荐用于典型情况?

【问题讨论】:

  • 您的系统永远不会在磁盘上同步。如果发生故障,您可能会丢失仍在缓冲区中但已被确认的消息。这取决于你需要有多严格。如果你能承受最终丢失几条消息的后果,那没关系。

标签: performance hornetq


【解决方案1】:

当您只有一个生产者时,必须将持久消息持久保存在磁盘上,并同步到您的磁盘。

客户端将一直阻塞,直到所有这些都发生。

服务器被编程为管理多个生产者并使用您的大部分硬件,但如果您只有一个生产者,您的性能将因网络延迟 + 磁盘同步速度而最大化。

因此,对于单个生产者而言,以非事务方式发送持久消息(每次发送都是同步)听起来不错。

编辑:还要查看 ConfigurationImpl 中的 set/getJournalBufferTimeout_AIO 和 set/getJournalBufferTimeout_NIO。这些是在服务器同步磁盘上的数据等待其他客户端同时同步之前发送到 TimedBuffer 的值。

【讨论】:

  • 所以你的意思是每秒 2 次写入磁盘的速率是正确的?我希望磁盘延迟在 ~10 毫秒而不是 ~500 毫秒。请纠正我。
  • 谢谢克莱伯特。向 OP 添加了一些 iostat 输出。
  • 您要发送多少条消息?系统将尝试在 TimedBuffer 上使用 sleep(nanoSeconds) ...如果您的内核不支持实时,则有一个检查将返回到简单的旋转。在某些情况下,nanoSleep 最多可以达到半秒。因此,如果您不支持实时,那么对于极少数消息,您可能会期望得到低响应。
  • 你已经看过这个问题了吗? stackoverflow.com/questions/7304136/…
  • 是的,看到了那个帖子,并想尝试一下,但我们使用的是核心,并且是嵌入式的,我看不到使用核心 api 设置它的方法。如果您对此有任何指示,请分享。此外,我们每秒发送 350 条消息,我们使用的是 Ubuntu 12.04.4 LTS,64 位。所以我认为它会支持实时,但我不确定(也不确定这到底意味着什么)。
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2019-08-16
  • 2016-07-28
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多