【发布时间】: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 message objects without copying 交互
请注意,我正在从 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)