ZMQ REQ/REP应用延迟问题:寻求<500us稳定延迟解决方案
ZMQ REQ/REP模式低延迟优化问题
我正尝试让ZMQ REQ/REP应用实现稳定的<500 us延迟,但遇到两类延迟问题:
- 首包延迟:延迟在5-6ms区间波动
- 随机延迟:每5-10秒随机出现,延迟在1-8ms区间波动
我能部分理解首包延迟是因为初始连接流程等原因,但无法理解随机延迟。我的应用仅包含1台服务器和1台客户端,均运行在本地,使用C++开发。我想了解REQ/REP模式是否适用于我的场景,或是我遗漏了某些配置。我编写了如下Python示例脚本复现该问题:
客户端代码
import zmq import time from random import randbytes port = "5556" context = zmq.Context() socket = context.socket(zmq.REQ) socket.connect("tcp://localhost:%s" % port) val = randbytes(200000) while True: st = time.time() message = socket.send(val) socket.recv() ed = time.time() took = (ed - st)*1000000 # us if took > 400: print(took)
服务器代码
import zmq import time port = "5556" context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://*:%s" % port) while True: st = time.time() message = socket.recv() socket.send(b"World from") ed = time.time() took = (ed - st)*1000000 #us if took > 200: print(took)
我已尝试的方案
- 不同模式(如Lazy Pirate等)
- 添加超时设置
- 使用recv轮询
- 增加Context中的I/O线程数
是否有人遇到过类似问题?
注:该问题与硬件无关,我已在不同硬件上测试。若您的测试结果与我不同,请告知。
更新1:我使用boost asio TCP套接字进行了相同基准测试,表现优异,平均延迟为14us。测试使用了cpp-ping-pong仓库,发送数据量相同。我认为可以得出结论:若无需组播,应使用POSIX套接字。
更新2:测试了libzmq提供的perf工具,表现更好。该工具原本测量平均延迟,我添加了单包延迟计算。对于200Kb数据,平均延迟为30us,但延迟在100us到2200us之间波动(首包)。
更新3:我现在有了更多线索,随机延迟可能由TCP缓冲导致。由于我的数据包较大,长期运行会产生延迟。
内容的提问来源于stack exchange,提问作者Gurses
相关产品推荐
相关产品推荐

