Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets ZeroMQ如何排队和发送排队消息?_Sockets_Zeromq - Fatal编程技术网

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

Sockets ZeroMQ如何排队和发送排队消息?,sockets,zeromq,Sockets,Zeromq,我是R包(0)的作者,该包使用ZeroMQ绑定()在HPC调度程序上分发函数调用。我使用了一个简单的REQ/REP套接字组合,工作人员首先请求所有任务的公共数据(调用函数和常量参数),然后从主控器中计算每个调用的数据。到目前为止,这种方法效果很好,因为运行计算通常比发送和接收数据慢一个数量级 然而,一个问题是公共数据的大小可能有几百MB,而迭代数据通常很小。因此,主机可能忙于发送大量公共数据,而无法同时发送迭代数据。因此,启动分布式计算时会有明显的延迟 但是,这可能不是由实际发送引起的,而是由准

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

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

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

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

所以我想知道:

  • ZeroMQ是在发送我们与
    send()
    一起放入队列中的数据,还是一个接一个地发送数据?1这会产生影响还是可以忽略不计?有没有办法影响这一点?
    • 据我所知,在这里从
      REP
      切换到
      ROUTER
      不会改变任何事情。2这是正确的吗
    • 如果它是串行的,我可能希望将数据分为慢速和快速套接字
  • 主要延迟是否可能是由之前发生的事情引起的,即复制大块内存以创建消息对象?3(我已经
    序列化了
    仅一次)
    
    • 在这种情况下,我希望与
请注意,我想从ZeroMQ的设计原理中寻找答案,而不是我可以作为基准的评论


以下是一些澄清:

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

1假设情况(TCP):一个
REP
master和n个
REQ
客户端;一个
路由器
主机和n
REQ
客户端<代码>推送
/
拉送
作为替代方法。除了使用不同的套接字之外,是否还有其他方法与之交互(可能不是通过像
rzmq
这样的高级绑定,但将我指向相关的低级文档也会有所帮助;我在《用户指南》中未找到此信息)

2我的意思是,如果我将
REQ
客户端连接到
路由器
主机,我自己管理信封(并且必须手动发送id和空帧),但这不会改变ZeroMQ在引擎盖下用于发送消息的代码。还是这样?这在哪里有记录?(我在用户指南中找不到)

3有效的答案是,瓶颈是内存拷贝,用于在主线程中初始化消息,然后在单独的线程中将消息依次发送到一个客户机,而不是阻塞主线程(如果是这种情况,或消息实际发生的任何情况)

1)显示零代码意味着任何答案都可能处于非常高的级别 尾注:

请注意,我想从ZeroMQ的设计原理中寻找答案,而不是我可以作为基准的评论

也没有帮助


那么,让我们一点一点地开始:

ZeroMQ正在发送一个接一个还是并行?

  • ZeroMQ
    上下文
    -实例是回答此问题的主实例。这取决于代码如何实例化数据泵引擎。在零代码发布的情况下,没有人能告诉你是或是
这会有什么不同吗?或者它可能可以忽略不计吗?

  • 一定要确保这会有很大的不同
有没有办法影响这一点

  • 是的,有几种方法可以影响这一点。这取决于你的代码。取决于您宣传的HPC/群集项目端到端体系结构。就我的经验而言,没有通用的一刀切或任何便宜(或免费)的魔杖。最好在您的项目中使用关于实时系统调度的深入知识库(以及benchmark、benchmark、benchmark——如果您想保留Git发布的关于卓越性能的承诺,那么这个包应该在测试中实现,并在实际部署中展示)
在此处从
代表切换到路由器将不会改变任何内容

  • 这是一个混合的部分。我一再主张避免在任何专业等级系统中天真地使用
    REQ/REP
    ,因为它不可避免地会陷入一个主要的、无法补救的相互僵局(可能会阅读我的其他文章)
这是正确的吗?

  • 如果不发布您的体系结构、实现原理和代码本身,任何严肃的人都不会告诉您42是否正确?谁知道?!?(当然,除了老鼠,也许还有马文。(所有相关的事实和细节都可以在《搭便车者指南》中找到,——这个想法是从那里借鉴的))
延迟是否可能由之前发生的事情引起,即复制大块内存以创建消息对象?(我已经
序列化了