ZeroMQ - 发布/发布延迟

时间:2015-06-27 01:28:13

标签: c++ zeromq latency

我正在调查ZeroMQ,看它是否适合软实时应用程序。我很高兴地看到小型有效载荷的延迟在30微秒左右的范围内。然而,在我的简单测试中,我得到了大约300微秒。

我有一个简单的发布者和订阅者,基本上是从网上的例子中复制而来,我通过localhost发送一个字节。

我已经玩了大约两天w /不同Bad entry in file /Users/mono/Documents/Git/MyApp/Localization.swift (line = 29): Argument is not a literal string. 并且我罢工了。

任何帮助将不胜感激!

酒馆 lisher:

sockopts

划刻器:

#include <iostream>
#include <zmq.hpp>
#include <unistd.h>

#include <sys/time.h>


int main()
{
    zmq::context_t context (1);
    zmq::socket_t publisher (context, ZMQ_PUB);
    publisher.bind("tcp://*:5556");

    struct timeval timeofday;
    zmq::message_t msg(1);
    while(true)
    {
        gettimeofday(&timeofday,NULL);
        publisher.send(msg);
        std::cout << timeofday.tv_sec << ", " << timeofday.tv_usec << std::endl;
        usleep(1000000);
    } 
}  

2 个答案:

答案 0 :(得分:0)

首先确保在不同的物理核心(不是HT)上运行生产者和消费者。 其次,它取决于硬件和操作系统。上次我测量内核IO(4 - 5年前),发送/接收系统调用的结果确实是10到20us。 您必须优化内核设置以降低延迟并设置TCP_NODELAY。

答案 1 :(得分:0)

任务定义是否真实?

一旦谈到* -real-time设计,架构能力验证比以下实现本身更重要。

如果按原样获取源代码,那么您的读数(与您的代码片段一起未发布以进行复制的MCVE重新测试的交叉验证)将不会起作用,因为数字不会区分发送方环路上的哪些部分(时间长度),发送方zmq-数据采集/复制/ schedulling /线路级格式化/数据报发送以及从媒体/复制/接收侧卸载解码/模式匹配/传播到接收器缓冲区

如果对ZeroMQ内部感兴趣,可以使用与性能相关的应用笔记。

如果努力实现最小延迟设计,请执行以下操作:

  • 删除所有开销
    • 从建议的 tcp / PUB 频道
    • 中替换所有 SUB - 标题处理
    • 避免处理所有非基本逻辑开销(没有意义花时间在 sub 划线方面(当然,更新版本的ZMQ已经进入 pub lisher-在所选的原型处理中使用模式匹配进行编码匹配(但使用 ZMQ_PAIR 避免任何此类,独立于传输类) - 如果它旨在阻止然后,相应地更改信令插座布局,以便主要避免阻塞(这应该是一个实时系统,如上所述)
    • 尽可能在目标多核/多核硬件架构中应用“延迟屏蔽”,以便从硬件/工具功能中挤出最后一滴备用时间......基准测试与更多实验设置I / O-threads'帮助 zmq::context_t context( N ); ,其中 N&gt; 1

缺少目标:

正如“仙境中的爱丽丝”在一个多世纪以前所说,只要没有定义目标,任何道路都会通向目标。

拥有一个软实时的目标,说明最大允许的端到端延迟并由此导致对传输层延迟的约束不是一个问题。

如果没有这样做,30 us,300 us或3 ms本身没有任何意义,所以没有人可以决定这些数字对于某些子系统是否“足够”。

合理的下一步:

  • 定义实时稳定性范围...如果用于实时控制
  • 定义实时设计约束...用于信号/数据采集,用于处理任务,用于自诊断&amp;控制服务
  • 避免任何阻止,设计方面&amp;验证/证明在所有可能的实际操作情况下都不会出现阻塞[正式证明方法已准备好执行此类任务](没有人希望看到AlertPanel [等待数据] 在你的下一次喷气式飞机着陆或最后一件事情发生之前,在一辆自动驾驶汽车撞到墙上之前,一个看起来很可爱的 [沙漏] animated-icon 当它移动沙子时控制系统变得忙碌,无论其背后的原因是什么,都是以一种毁灭性的阻挡方式。

量化目标对测试有意义。

如果给定的阈值允许具有500毫秒的稳定范围(这可能是慢速液压执行器/控制回路的安全值,但可能无法用于导弹控制系统,则对于任何[质量和惯性动量]无系统(类似于DSP系列的RT控制系统)),如果您的处理适合于它们,您可以进行端到端测试。

如果你知道,你的输入数据流每500 us就会产生10 kB,你可以测试你的设计是否可以跟上突发流量的步伐。

如果您进行测试,您的模型设计确实错过了您很熟悉的目标(不符合性能/时间限制的数字),设计或架构需要改进的位置。