performance - ActiveMQ 5.10/QPid 0.28/AMQP 1.0性能问题

标签 performance activemq amqp qpid

我正在尝试将Openwire和AMQP与ActiveMQ一起使用的性能基准测试,并获得吞吐量的巨大差异

使用Openwire

永久邮件大小:43个再见,
没有压缩
200个并发连接,
吞吐量约为9006 msgs /秒。

永久邮件大小:1580再见,
没有压缩
200个并发连接,
吞吐量约为3678.86 msgs / sec。

上的CPU负载不多于5%,因此不足以使我可以使用压缩来获得更好的吞吐量,但这是另一回事。

使用AMQP 1.0

永久邮件大小:43个再见,
没有压缩
200个并发连接,
吞吐量约为12.8 msgs /秒。

永久邮件大小:1580再见,
没有压缩
200个并发连接,
吞吐量约为11.9 msgs / sec。

我们的配置是

**Client**
    - JMeter 2.11 using Apache QPid 0.28 as AMQP 1.0 client
    - Java 1.7
    - Ubuntu 12.04 LTS Quad Core 2.0 GHz,7GB RAM, 512 KB Cache

**Broker**
    - ActiveMQ 5.10 with KahaDB, using LevelDB didn't give much different numbers
    - Java 1.7
    - Ubuntu 12.04 LTS Quad Core 2.0 GHz,7GB RAM, 512 KB Cache

调整工作:

我看了以下

对于Openwire,在Broker端,将tcp更改为nio
<transportConnector name="openwire" uri="nio://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.tcpNoDelayEnabled=true&amp;wireFormat.maxFrameSize=104857600"/>

On Client side url was as
    tcp://<broker ip>:61616?jms.useAsyncSend=true

对于AMQP 1.0,在Broker端,更改为nio并在url上添加了一些选项,但效果不明显
<transportConnector name="amqp" uri="amqp+nio://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

On Client side
    connectionFactory = amqp://username:password@<broker ip>:5672?remote-host=default

Openwire上所有可用的调整选项在amqp上均不可用,特别是在使用jms.useAsyncSend = true的生产者上,这给我带来了巨大的性能提升,当然还有ack可靠性较低。我知道默认情况下,默认情况下,使用amqp发送消息处于异步模式。显然,这些数字告诉我们,它可能正在以同步模式进行处理?

这是我已经研究过的一些链接
  • http://activemq.apache.org/amqp.html
  • http://bhavin.directi.com/rabbitmq-vs-apache-activemq-vs-apache-qpid/
  • http://activemq.2283324.n4.nabble.com/Interesting-Persistent-Messaging-Performance-td4676001.html
  • http://activemq.2283324.n4.nabble.com/Any-Performance-Latency-benchmarks-for-ActiveMQ-s-AMQP-implementation-against-OpenWire-td4674713.html
  • http://www.slideshare.net/ceposta/activemq-performance-tuning#
  • http://working-with-activemq.blogspot.com/2012/05/performance-improvements.html

    是否没有我不知道的ActiveMQ AMQP和/或QPid的配置(用于连接或通道)或调整选项?

  • 更新1:

    正如Tim在下面指出的那样,我的比较是不正确的,我在Openwire上使用Async.Send,在AMQP 1.0上使用Sync.Send,这是我的误解,因为AMQP 1.0默认使用Async.Send。罗比指出,持久消息并非如此。这是正确的比较数字

    使用Openwire同步发送
    永久邮件大小:43个再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为13.1 msgs /秒。

    永久邮件大小:1580再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为13.1 msgs /秒。

    使用AMQP 1.0同步发送
    永久邮件大小:43个再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为12.8 msgs /秒。

    永久邮件大小:1580再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为11.9 msgs / sec。

    异​​步。使用Openwire发送
    永久邮件大小:43个再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为9006 msgs /秒。

    永久邮件大小:1580再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为3678.86 msgs / sec。

    异​​步。使用AMQP 1.0发送
    永久邮件大小:43个再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为21.7 msgs /秒。

    永久邮件大小:1580再见,
    没有压缩
    200个并发连接,
    100,000条消息,
    吞吐量约为21.2 msgs /秒。

    注意:

    即使不能保证使用Async.Send消息传递,使用Openwire我也总是收到所有100,0000条消息,而使用AMQP 1.0时,大约25%的消息丢失了。

    AMQP 1.0异步发送编号仍不接近Openwire异步发送编号。还有其他建议吗?

    谢谢你的帮助。

    最佳答案

    目前,您在经纪人方面无法做很多事情来提高AMQP性能。请记住,由于您在ActiveMQ客户端上禁用了同步发送,因此您在此处所做的并不是真正的比较,这会导致生产者的交付量不足保证。如果要尝试以这种方式进行比较,则应尝试使QPid JMS客户端也以这种方式发送其消息。 QPid JMS ConnectionFactory上有一个同步发布选项,您可以尝试查看是否可以不发送未解决的消息,因为这基本上需要对每个消息进行确认。

    我不认为QPid JMS客户端实现为性能最高的AMQP 1.0客户端,而是更多地是概念验证,因此随着新客户端的编写,这种情况可能会改变。这里的另一个瓶颈是ActiveMQ使用的Proton-J的当前实现与我们经过长时间硬化的OpenWire传输相比性能不是很好,因此在该库变得更好之前,性能将受到损害。 Proton-J一直​​在发展,因此随着时间的推移,情况应该会有所改善。

    如果仅使用AMQP客户端进行发送和接收,则可以在ActiveMQ中将AMQP传输配置为使用原始转换器选项,这样可以减少为每条消息完成的工作,但不会节省很多。

    <transportConnector name="amqp" uri="amqp://localhost:5672?transport.transformer=raw"/>
    

    最好的选择是深入研究QPid JMS客户端代码,以查看是否可以将其配置为发送已解决的持久消息。

    在现阶段,OpenWire在ActiveMQ上将始终比AMQP更快,因此,除非您有令人信服的理由使用AMQP,否则请坚持使用本机OpenWire客户端。您可以尝试ActiveMQ的主干版本(v5.11-SNAPSHOT),该版本在AMQP方面进行了一些额外的工作,确实做了一些改进,并且使用了最新的Proton-J版本,该版本也有所改进。这将是一个持续工作的领域,因此您可以预期性能会随着时间的推移而改善。

    关于performance - ActiveMQ 5.10/QPid 0.28/AMQP 1.0性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768169/

    相关文章:

    java - 找不到 java.lang.AutoCloseable 的类文件 - ActiveMQ 代码

    c# - 从多个队列读取,RabbitMQ

    c++ - 如何使用 AMQP-CPP 库删除 RabbitMQ 中的所有队列

    Python 禁用日志记录减慢脚本

    java - 如何在 activemq.xml 中创建/预配置持久订阅者,以便这些订阅在 ActiveMQ 启动时准备就绪?

    java - ART(Android 运行时环境)中的 ArrayList 循环性能

    activemq - 如何将 activemq-core.xsd url 与 jar 文件中找到的 activemq.xsd 关联?

    node.js - 如何使用 node-amqp 获取队列中的消息数

    ios - 确定 GPS 位置是否在 gpx 航迹段内

    Android ORMlite 与 queryForAll() 的性能问题