You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:53:24