我想测试有多少订阅者可以连接到发布者,该发布者正在快速发送消息,但不是以最大速度,例如每微秒。
原因是,如果我以最大速度发送消息,我会在接收器处错过消息(高水位线)。
我想,我可以使用 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_SNDBUF
、 ZMQ_IMMEDIATE
、 ZMQ_AFFINITY
、 ZMQ_TOS
和 ZMQ_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/