【问题标题】:How does ZeroMQ queue and send queued messages?ZeroMQ 如何排队和发送排队的消息?
【发布时间】:2018-02-18 21:19:26
【问题描述】:

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

然而,一个问题是公共数据可能有数百 MB 大小,而迭代数据通常很小。因此,master 可能会忙于发送大量公共数据而无法同时发送迭代数据。因此,启动分布式计算时会有明显的延迟。

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

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

所以我想知道:

  • ZeroMQ 是一个接一个地或并行地发送我们与send() 放入队列的数据吗?1 这会产生影响还是可以忽略不计?有没有办法影响这个?
    • 据我了解,这里从REP 切换到ROUTER 不会有任何改变。2 这样对吗?
    • 如果是串行的,我可能希望将数据分成慢速和快速套接字
  • 主要延迟是否可能是由之前发生的事情引起的,即复制大块内存以创建消息对象?3(我已经serialize只有一次)

请注意,我正在从 ZeroMQ 的设计原理中寻找答案,而不是我可以进行基准测试的评论。


以下一些说明:

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

1 假设情况(TCP):一个REP master 和 n REQ clients;一个ROUTER master 和 n REQ 客户端; PUSH/PULL 作为替代方法。除了使用不同的套接字之外,还有其他方法可以与之交互(可能不是来自像rzmq 这样的高级绑定,但将我指向相关的低级文档也会有所帮助;我在用户指南中没有找到此信息)

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

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

【问题讨论】:

  • 而且,Marvin 忍不住要问,到目前为止,你有没有对任何东西进行基准测试?如果是这样,结果在哪里? ;o)

标签: sockets zeromq


【解决方案1】:

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

尾注:

请注意,我正在从 ZeroMQ 的设计原理中寻找答案,而不是我可以进行基准测试的评论。

也没有用。


那么,让我们一个接一个地开始:

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

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

这会有所不同还是可能可以忽略不计?

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

有没有办法来影响这个?

  • 是的,有几种方法可以影响这一点。取决于你的代码。取决于您宣传的 HPC/集群项目端到端架构。就我的经验而言,没有万能的万能法或任何便宜(或免费)的魔杖。最好为您的项目使用有关实时系统调度(以及基准、基准、基准)的深入知识库——如果您想保留 Git 发布的关于卓越性能的承诺,这个包应该在测试中实现并维持在实际部署中展示)。

REP to ROUTER 切换不会改变任何事情。

  • 这是一个混合部分。我一再主张避免在任何专业等级系统中天真地使用 REQ/REP,因为它不可避免地会陷入本金的内在亲和力,不可挽救的相互僵局(可以阅读我的其他 @ 987654321@s)

这是正确的吗?

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

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

  • 答案(即使使用概率视图)100% 隐藏在您的代码中。 ZeroMQ Context,如果配置正确,不会单独增加任何明显的延迟。 ZeroMQ API 文档中详细记录了该过程,因此如果尝试将 1kB、1 MB 或 “数百 MB” BLOB 编组到 .send() --方法,一个人应该很清楚以他/她自己的方式这样做的原因。

在这种情况下,我想与 ZeroMQ 进行交互消息对象不复制

  • 嗯,这始终是如何在 ZeroMQ 中调度数据的首选方式。另请注意,零拷贝准则不涵盖 O/S 内核 数据缓冲区操作,因此认真的项目计划应考虑实际操作(量子纠缠作为无质量瞬间在我们当前的 O/S 内核中,在零时间或远程传输中无限距离发送信号不起作用,因此请记住当前已知的硅和硬件原理)

【讨论】:

  • 感谢您的回答。我在上面添加了一些 cmets 来阐明意图。你的观点:一个接一个或并行有哪些方法可以做到这一点?他们在哪里记录? 有没有办法我不明白这与消息在上下文中的排队方式有什么关系,切换,正确它们是否在后台处理差异?如果是这样,如何? 延迟可能导致 zmq中哪个线程处理了什么? 想要接口不需要零拷贝,使用zmq_msg_copy 不丢弃大的重复块可能就足够了(但仍需要修改r 绑定)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多