ZeroMQ如何排队和发送排队的消息?

时间:2017-09-10 14:54:15

标签: sockets zeromq

我是R包(clustermq 0 )的作者,它使用ZeroMQ绑定(rzmq)在HPC调度程序上分发函数调用。我使用了REQ / REP套接字的简单组合,工作者首先请求所有任务的公共数据(要调用的函数和常量参数),然后是他们应该评估的每个调用的数据来自大师。到目前为止,这种方法运行良好,因为运行计算通常比发送和接收数据慢一个数量级。

然而,一个问题是公共数据的大小可能有几百MB,而迭代数据通常很小。因此,主机将忙于发送大量公共数据并且不能同时发送迭代数据。因此,启动分布式计算时会出现明显的延迟。

但是,这可能不是由实际发送而是准备消息引起的。 documentation州:

  

ZeroMQ不会立即发送消息(单个或多个部分),但在某些不确定的时间发送。

所以我想知道:

  • ZeroMQ是否一个接一个地或者并行地发送我们放入队列send()的数据? 1 这会产生影响还是可以忽略不计?有没有办法影响这个?
    • 据我了解,此处从REP切换到ROUTER不会改变任何内容。 2 这是正确的吗?
    • 如果它是串行的,我可能想将数据分成慢速和快速插座
  • 主延迟是否可能是由之前的发生的,即复制大块内存以创建消息对象? 3 (我已经serialize了一旦)

请注意,我正在寻找ZeroMQ设计原理的答案,而不是我可以评估的评论。

以下一些说明:

0 这并不是以理论上最有效的方式实现,而是使用rzmq提供的函数。目标是改进在NAS上存储所有内容并从那里检索它的包(这是一个相当低的栏)。这是一个侧面项目,我不是系统工程师(我不擅长低级ZeroMQ)。我正在对开销和现实世界(例如我的实际工作)示例进行基准测试,但这还没有进入文档。

1 假设案例(TCP):一个REP主服务器和 n REQ个客户端;一个ROUTER主服务器和 n REQ个客户端; PUSH / PULL作为替代方法。除了使用不同的套接字(可能不是来自rzmq之类的高级绑定,还有另外一种与此接口的方式,但指向相关的低级文档也会有帮助;我还没有在用户中找到此信息指南)

2 我的意思是,如果我将REQ个客户端连接到ROUTER主服务器,我自己管理信封(并且必须发送id并清空)手动框架),但这不会改变ZeroMQ在引擎盖下用来发送消息的代码。或者是吗?这记录在哪里? (我在用户指南中找不到它)

3 对此的有效答案是瓶颈是内存副本,用于在主线程中初始化消息,然后在另一个线程中将消息发送到另一个客户端,而不是阻止main(如果是这种情况,或者消息实际发生的任何事情)

1 个答案:

答案 0 :(得分:2)

1)显示零代码意味着任何答案可能只是处于非常高的水平

尾随说明:

  

请注意,我正在寻找ZeroMQ设计原理的答案,而不是我可以评估的评论。

也没有帮助。

所以,让我们一点一点地开始:

ZeroMQ是一个接一个地发送...... 还是并行发送?

  • ZeroMQ Context -instance是回答此问题的主人。这取决于您的代码如何实例化数据泵引擎。发布零代码后,没有人可以告诉你或者。

这会产生影响吗?是否可以忽略不计?

  • 确保它有所作为,一个大的。

有没有办法 来影响这个?

  • 是的,有几种方法可以影响这一点。取决于您的代码。取决于您宣传的HPC /群集项目端到端架构。就我的经验而言,没有通用的一刀切或任何便宜(或免费)的魔杖。最适合您的项目的深入了解实时系统调度(以及基准测试,基准测试,基准测试 - 如果您想要保留Git发布的卓越性能承诺,此测试包应该在测试中实现并持续到展示在实际部署中。)
来自 REP to ROUTER

切换 不会改变任何内容。

这是正确的吗?

  • 没有发布您的架构,实现原理和代码本身,没有人会告诉您。 42是否正确?谁知道?!? (当然,除了老鼠,也许还有Marvin。(所有相关事实和细节都可以在 Hitchhiker's Guide 中找到 - 这个想法是从那里借来的))

延迟是否可能是由之前发生的事情引起的,即复制大块内存以创建消息对象? (我已经serialize只有一次)

  • 答案(即使使用概率视图)在您的代码中100%隐藏。 ZeroMQ Context ,如果配置正确,将不会自行添加任何显着的延迟。 ZeroMQ API文档中详细记录了该过程,因此如果尝试将1kB,1 MB或 “几百MB” BLOB编组为 {{1 } - 方法,人们应该很清楚这样做的原因。

在这种情况下我想要与ZeroMQ接口消息对象而不复制

  • 嗯,这始终是如何在ZeroMQ内部调度数据的首选方式。还要注意,零拷贝格言不包括O / S内核数据缓冲区操作,因此一个严肃的项目计划应该考虑到实际操作(量子纠缠作为无质量的瞬间在零时间或远距传送中无限距离的信号在我们当前的O / S内核中不起作用,所以请记住当前已知的芯片和硬件原理)