我正在调查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);
}
}
答案 0 :(得分:0)
首先确保在不同的物理核心(不是HT)上运行生产者和消费者。 其次,它取决于硬件和操作系统。上次我测量内核IO(4 - 5年前),发送/接收系统调用的结果确实是10到20us。 您必须优化内核设置以降低延迟并设置TCP_NODELAY。
答案 1 :(得分:0)
一旦谈到* -real-time设计,架构能力验证比以下实现本身更重要。
如果按原样获取源代码,那么您的读数(与您的代码片段一起未发布以进行复制的MCVE重新测试的交叉验证)将不会起作用,因为数字不会区分发送方环路上的哪些部分(时间长度),发送方zmq-数据采集/复制/ schedulling /线路级格式化/数据报发送以及从媒体/复制/接收侧卸载解码/模式匹配/传播到接收器缓冲区
如果对ZeroMQ内部感兴趣,可以使用与性能相关的应用笔记。
如果努力实现最小延迟设计,请执行以下操作:
tcp
/ PUB
频道SUB
- 标题处理
ZMQ_PAIR
避免任何此类,独立于传输类) - 如果它旨在阻止然后,相应地更改信令插座布局,以便主要避免阻塞(这应该是一个实时系统,如上所述)zmq::context_t context( N );
,其中 N&gt; 1 强> 正如“仙境中的爱丽丝”在一个多世纪以前所说,只要没有定义目标,任何道路都会通向目标。
拥有一个软实时的目标,说明最大允许的端到端延迟并由此导致对传输层延迟的约束不是一个问题。
如果没有这样做,30 us,300 us或3 ms本身没有任何意义,所以没有人可以决定这些数字对于某些子系统是否“足够”。
AlertPanel
[等待数据] 在你的下一次喷气式飞机着陆或最后一件事情发生之前,在一辆自动驾驶汽车撞到墙上之前,一个看起来很可爱的 [沙漏] animated-icon
当它移动沙子时控制系统变得忙碌,无论其背后的原因是什么,都是以一种毁灭性的阻挡方式。如果给定的阈值允许具有500毫秒的稳定范围(这可能是慢速液压执行器/控制回路的安全值,但可能无法用于导弹控制系统,则对于任何[质量和惯性动量]无系统(类似于DSP系列的RT控制系统)),如果您的处理适合于它们,您可以进行端到端测试。
如果你知道,你的输入数据流每500 us就会产生10 kB,你可以测试你的设计是否可以跟上突发流量的步伐。
如果您进行测试,您的模型设计确实错过了您很熟悉的目标(不符合性能/时间限制的数字),设计或架构需要改进的位置。