c - 如何在 ZeroMQ 中以定义的速率发送消息?

标签 c time zeromq measurement

我想测试有多少订阅者可以连接到发布者,该发布者正在快速发送消息,但不是以最大速度,例如每微秒。

原因是,如果我以最大速度发送消息,我会在接收器处错过消息(高水位线)。

我想,我可以使用 nanosleep(),它可以很好地每秒处理 20 条消息 ( sleep: 50000000 [ns] )。但随着 sleep 时间的缩短,情况会变得更糟:195(5000000)、1700(500000)、16000(50000)条消息。而且 sleep 时间更短,我也收不到更多消息。 sleep 功能本身似乎需要一些时间,如果我打印出时间戳,我可以看到这一点。

因此,我认为以特定速率运行函数是错误的方法。但我没有找到其他方法来做到这一点。

是否有可能每秒发送大约 1000000 条消息?

最佳答案

问:如何以定义的速率发送消息?

给定的 API 是 v.4.2.3+,可以使用 { pgm:// | epgm:// } - 为此目的传输类并设置适当调整的 .setsockopt( ZMQ_RATE, <kbps> ) 另外,还展示了一些与性能相关的缓冲区大小调整( ZMQ_SNDBUFZMQ_IMMEDIATEZMQ_AFFINITYZMQ_TOSZMQ_MULTICAST_MAXTPDU )以及一些优先级映射等,以便安全地接近根据需要达到硬件限制。

<小时/>

问:是否有可能每秒发送大约 1,000,000 条消息?

好吧,鉴于每个消息到线路的调度延迟不超过 1000 [ns],因此需要进行仔细的工程设计。

此速率的最佳候选者是使用 inproc:// 传输类,因为这不依赖于 ZeroMQ 的 Context -实例 IO 线程性能/外部 O/S 调度程序内的瓶颈(并且肯定会比任何其他类型的可用传输类工作得更快)。不过,这取决于它是否可以满足低于 1000 [ns] 延迟的要求,具体取决于您的应用程序设计和消息大小(零复制是我们的 friend ,可以更好地满足延迟期限)。

关于c - 如何在 ZeroMQ 中以定义的速率发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016626/

相关文章:

python - Ruby 和 Python 之间的 ZeroMQ PAIR/PAIR 连接

php - SOCKET_PUSH 不使用 ZMQContext 发送任何内容? [被防火墙阻止...]

使用 switch-case 语句更改可以为 2,4 或 8 字节的整数的 Endiannes

c - _mm256_store_ps() 函数是原子的吗?与 openmp 一起使用时

c - `*`(星号)是 C11 中的关键字吗?

string - 显示没有毫秒的 CFGregorianDate

mysql - 如何防止同一日期的时间重叠?

c - "Stray '\' in program, ' 否则 ' without ' 如果'

C++ 如何将年-月-日格式的日期转换为 unix 纪元格式?

qt - ZeroMQ 正在吞噬我的数据......但只是有时