我是R包(clustermq
0 )的作者,它使用ZeroMQ绑定(rzmq
)在HPC调度程序上分发函数调用。我使用了REQ
/ REP
套接字的简单组合,工作者首先请求所有任务的公共数据(要调用的函数和常量参数),然后是他们应该评估的每个调用的数据来自大师。到目前为止,这种方法运行良好,因为运行计算通常比发送和接收数据慢一个数量级。
然而,一个问题是公共数据的大小可能有几百MB,而迭代数据通常很小。因此,主机将忙于发送大量公共数据并且不能同时发送迭代数据。因此,启动分布式计算时会出现明显的延迟。
但是,这可能不是由实际发送而是准备消息引起的。 documentation州:
ZeroMQ不会立即发送消息(单个或多个部分),但在某些不确定的时间发送。
所以我想知道:
send()
的数据? 1 这会产生影响还是可以忽略不计?有没有办法影响这个?
REP
切换到ROUTER
不会改变任何内容。 2 这是正确的吗?serialize
了一旦)
请注意,我正在寻找ZeroMQ设计原理的答案,而不是我可以评估的评论。
以下一些说明:
0 这并不是以理论上最有效的方式实现,而是使用rzmq
提供的函数。目标是改进在NAS上存储所有内容并从那里检索它的包(这是一个相当低的栏)。这是一个侧面项目,我不是系统工程师(我不擅长低级ZeroMQ)。我正在对开销和现实世界(例如我的实际工作)示例进行基准测试,但这还没有进入文档。
1 假设案例(TCP):一个REP
主服务器和 n REQ
个客户端;一个ROUTER
主服务器和 n REQ
个客户端; PUSH
/ PULL
作为替代方法。除了使用不同的套接字(可能不是来自rzmq
之类的高级绑定,还有另外一种与此接口的方式,但指向相关的低级文档也会有帮助;我还没有在用户中找到此信息指南)
2 我的意思是,如果我将REQ
个客户端连接到ROUTER
主服务器,我自己管理信封(并且必须发送id并清空)手动框架),但这不会改变ZeroMQ在引擎盖下用来发送消息的代码。或者是吗?这记录在哪里? (我在用户指南中找不到它)
3 对此的有效答案是瓶颈是内存副本,用于在主线程中初始化消息,然后在另一个线程中将消息发送到另一个客户端,而不是阻止main(如果是这种情况,或者消息实际发生的任何事情)
答案 0 :(得分:2)
尾随说明:
请注意,我正在寻找ZeroMQ设计原理的答案,而不是我可以评估的评论。
也没有帮助。
所以,让我们一点一点地开始:
ZeroMQ是一个接一个地发送...... 还是并行发送?
Context
-instance是回答此问题的主人。这取决于您的代码如何实例化数据泵引擎。发布零代码后,没有人可以告诉你或者。这会产生影响吗?是否可以忽略不计?
有没有办法 来影响这个?
REP to ROUTER
的切换 不会改变任何内容。
REQ/REP
,因为它是不可避免的内在亲和力,不属于主要的,不可挽救的相互僵局(可能会读取其他内容)我的posts, where this warning is quite often presented and explained in colourful details s)这是正确的吗?
主延迟是否可能是由之前发生的事情引起的,即复制大块内存以创建消息对象? (我已经serialize
只有一次)
Context
,如果配置正确,将不会自行添加任何显着的延迟。 ZeroMQ API文档中详细记录了该过程,因此如果尝试将1kB,1 MB或 “几百MB” BLOB编组为 {{1 } - 方法,人们应该很清楚这样做的原因。在这种情况下我想要与ZeroMQ接口消息对象而不复制