2017-02-13 50 views
0

我正在尝试编写网络传输应用程序。ZeroMQ比增强asio慢吗?

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

客户端每秒产生1000个数据。我希望尽可能快地传输数据。

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

正如你所看到的,两种方法的表现都不好。

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

Q1:我想问一下,是否ZeroMQ只适合小消息?

Q2:有没有办法提高ZeroMQ速度?

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

回答

1

数据速率

你试图移动800兆字节/秒。这是什么样的联系?对于运输级的tcp://,它必须非常快速,例如100 Gbit/s以太网,这是非常奇特的。

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

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

替代零拷贝 - 零换乘

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

我以前混合使用ZMQ和旗语锁定C++ stl::queue,(在我的情况PUSH/PULL)使用ZMQ简单地为它的模式,stl::queue进行共享数据指针,并保留数据依然。发送方锁定队列,将共享指针放入队列中,然后通过zmq套接字发送一条简单消息(例如“1”)。收件人读取“1”并将其用作提示来锁定队列并从中拉出共享指针。因此,通过stl::queue以ZMQ模式将共享数据指针从一个线程转移到另一个线程,但数据本身保持不变。我所做的只是在线程之间传递数据的所有权。只要发送完成后发送已经超出范围的共享指针并且发件人未使用它来修改或访问数据,它就会工作。

PUSH/PULL不算太差处理 - 每条消息都只有一个收件人。需要花费更多的努力来与PUB/SUB进行混合,并且接收到的消息必须被视为只读,因为每个接收者将与其他人有相同的数据块的共享指针。

邮件大小

我已经不知道我有多大块zmqtp同时传输,但猜想,它在协议方面相对有效的:数据率。

+0

@ user3666197,感谢您的精彩! – bazza