3

我目前正在对一些通信中间件进行延迟基准测试,我发现 ZeroMQREQREP套接字速度非常慢。例如,我期望 ZeroMQ 会比 ZeroC Ice 快。为了完整起见,这里是迄今为止的测试结果:

  1. Ice 每秒 7600 条消息
  2. ZeroMQ 4300 - 每秒 4500 条消息

该消息是以数据结构作为参数的远程调用。数据结构包含基本类型的字段(int、float、double、boolean、string)。起初我怀疑使用 Protocol Buffers 序列化数据可能是 ZeroMQ 的瓶颈,但后来我使用空消息进行了测试,结果非常相似。即使 ZeroMQ 发送空消息,Ice 也更快。

尽管如此,我还是想给 ZeroMQ 一个公平的机会。REQ本着这种精神,我想知道我是否可以REP以任何方式提高速度。也许我应该使用其他套接字?唯一的限制是通信应该类似于 RPC。客户端在期望其消息的结果时不应做任何工作。

这是我的实现代码。我提供了 Java 版本的基准测试,但 Python(慢一点)和 C++(快一点)的结果非常相似:

客户

...
MQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REQ);
socket.connect("tcp://*:5555");

for(int i=0; i<measuredIterations; i++){
    t0 = System.nanoTime();
    socket.send("",0);
    socket.recv(0);
    rtt = System.nanoTime() - t0;
    ...
}

服务器

ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REP);
socket.bind("tcp://*:5555");


while (!Thread.currentThread().isInterrupted()){
    socket.recv(0);
    socket.send("",0);
}

其余代码基本上用于计算平均延迟和每秒消息数。

也许 ZeroMQ 对于这种通信模式来说只是慢,它在多对多通信模式中表现出色......

注意:我在记录结果之前“加热”了两个中间件。尽管如此,ZeroMQ 总是比 Ice 慢。

EDIT1:我将升温迭代次数增加到 10000。新结果是:

  1. Ice 每秒 8100 条消息(随着变暖而收敛到 8250)
  2. ZeroMQ + 协议缓冲区收敛到每秒 4650 条消息
4

0 回答 0