我正在尝试使用 Openwire 和 AMQP 与 ActiveMQ 进行性能基准测试,并获得巨大的吞吐量变化
使用 Openwire
持久消息大小:43 个字节,无压缩,200 个并发连接,吞吐量约为 9006 msgs/sec。
持久消息大小:1580 个字节,无压缩,200 个并发连接,吞吐量约为 3678.86 msgs/sec。
CPU 上的负载少于5%,因此我可以使用压缩来获得更好的吞吐量,但这是另一回事。
使用 AMQP 1.0
持久消息大小:43 个字节,无压缩,200 个并发连接,吞吐量约为 12.8 msgs/sec。
持久消息大小: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&wireFormat.tcpNoDelayEnabled=true&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&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。Robbie 指出,持久消息并非如此。这是正确的比较数字
使用 Openwire 持久消息大小进行同步发送:43 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 13.1 毫秒/秒。
持久消息大小:1580 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 13.1 msgs/sec。
使用 AMQP 1.0 的同步发送 持久消息大小:43 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 12.8 毫秒/秒。
持久消息大小:1580 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 11.9 msgs/sec。
Async.Send 使用 Openwire 持久消息大小:43 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 9006 条消息/秒。
持久消息大小:1580 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 3678.86 msgs/sec。
Async.Send 使用 AMQP 1.0 持久消息大小:43 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 21.7 msgs/sec。
持久消息大小:1580 个字节,无压缩,200 个并发连接,100,000 条消息计数,吞吐量约为 21.2 msgs/sec。
笔记:
即使使用 Async.Send 无法保证消息传递,但使用 Openwire 我总是收到所有 100,0000 条消息,而使用 AMQP 1.0 时大约 25% 的消息丢失了。
AMQP 1.0 Async.Send 号码仍然不接近 Openwire Async.Send 号码。还有其他建议吗?
谢谢你的帮助。