Is ZeroMQ slower than boost asio?



我正在尝试编写一个网络传输应用程序。

数据是二进制数据,每个数据包的大小大多为800KB。

客户端每秒产生1000个数据。我想尽快传输数据。

当我使用ZeroMQ时,速度达到每秒350个数据,但提升asio达到每秒400个(或更多)。

正如您所看到的,这两种方法的性能都不好。

ZeroMQ使用的模式是PUSH/PULL模式,boost asio是简单的同步I/O。

Q1:我想问,ZeroMQ是否只适用于小消息?

Q2:有办法提高ZeroMQ的速度吗?

Q3:如果ZeroMQ不能,请建议一些好的方法或库来改进这种数据传输。

数据速率

您正试图每秒移动800 MB。这是什么样的联系?对于tcp://传输类,它必须非常快速,例如100 Gbit/s以太网,这是非常奇特的。

所以我假设它是一个ipc://传输类连接。在这种情况下,您可以使用ZeroMQ zerocopy函数进行改进,从而避免重复复制数据。

对于正常传输,您必须将数据复制到zmq消息中,该消息必须复制到ipc管道中,再次复制出去,然后在接收端复制回一个新的zmq消息。所有这些复制都需要4 x 800=2.4 GByte/sec的内存带宽,当缓存冲突开始时,这在典型PC系统的总内存带宽中占了相当大的百分比。使用零拷贝应该将其减半。

零复制的替代方案-零传输

如果使用ipc://,则考虑不通过套接字发送数据,而是通过套接字发送对数据的引用。

我之前已经混合使用了zmq和信号量锁定的C++stl::queue,使用zmq只是为了它的模式(在我的例子中是PUSH/PULL),stl::queue携带指向数据的共享指针,并保持数据静止。发送方锁定队列,将共享指针放入其中,然后通过zmq套接字发送一条简单消息(例如"1")。接收方读取"1",并将其用作锁定队列并从中提取共享指针的提示。因此,指向数据的共享指针已通过stl::queue以ZMQ模式从一个线程传输到另一个线程,但数据本身保持静止。我所做的只是在线程之间传递数据的所有权。只要发送的共享指针在发送后立即超出范围,并且发件人没有使用它来修改或访问数据,它就可以工作。

PUSH/PULL处理起来还不错——每条消息只发给一个收件人。与PUB/SUB进行这种混合需要付出更多的努力,并且接收到的消息必须被视为只读消息,因为每个收件人都有一个指向与其他人相同数据块的共享指针。

消息大小

我不知道zmqtp一次传输多大的块,但我想就协议:数据比率而言,它相对高效。

最新更新