我正在使用zmq来跨进程传递消息,我想做一些性能测试以获得延迟和整个过程。
官方网站提供了告诉How to Run Performance Tests
的指南例如,我尝试过:
local_lat tcp://*:15213 200 100000
remote_lat tcp://127.0.0.1:15213 200 100000
并得到结果:
message size: 200 [B]
roundtrip count: 100000
average latency: 13.845 [us]
但是当在C ++中尝试pub-sub example时,我发现发送和接收之间的时间间隔大约是150us。 (我通过带有时间戳的打印日志获得结果)
有人可以解释这两者之间的区别吗?
修改 我找到了问题0mq: pubsub latency continually growing with messages?结果给出了几乎恒定的0.00015s延迟,即150us,与我的测试相同,是官方性能测试的10倍。为什么有区别?
答案 0 :(得分:0)
我遇到了同样的问题:ZeroMQ - pub / sub latency
我在我的示例代码上运行wireshark,每秒发布一个zeromq消息。这是wireshark的输出:
145 10.900249 10.0.1.6 -> 10.0.1.6 TCP 89 5557→51723 [PSH, ACK] Seq=158 Ack=95 Win=408192 Len=33 TSval=502262367 TSecr=502261368
146 10.900294 10.0.1.6 -> 10.0.1.6 TCP 56 51723→5557 [ACK] Seq=95 Ack=191 Win=408096 Len=0 TSval=502262367 TSecr=502262367
147 11.901993 10.0.1.6 -> 10.0.1.6 TCP 89 5557→51723 [PSH, ACK] Seq=191 Ack=95 Win=408192 Len=33 TSval=502263367 TSecr=502262367
148 11.902041 10.0.1.6 -> 10.0.1.6 TCP 56 51723→5557 [ACK] Seq=95 Ack=224 Win=408064 Len=0 TSval=502263367 TSecr=502263367
正如您所看到的,发送和确认每条消息大约需要45微秒。起初我以为连接正在重新建立在每条消息上,但事实并非如此。所以我把注意力转向接收器......
while(true)
if(subscriver.recv(&message, ZMQ_NOBLOCK)) {
// print time
}
}
通过添加ZMQ_NOBLOCK并在艰难的while循环中进行轮询,我将时间缩短到100us。这仍然看起来很大,而且它的代价是飙升一个核心。但我确实觉得我对问题的理解稍微好一些。任何见解都将不胜感激。