ZeroMQ缓冲区大小v / s高水位线

时间:2017-05-04 19:21:57

标签: zeromq pyzmq

zeromq socket options中,我们有高水位标记和缓冲区大小的标记。

发送时,ZMQ_SNDHWMZMQ_SNDBUF

有人可以解释这两者之间的区别吗?

1 个答案:

答案 0 :(得分:2)

每个人控制其他一些事情:

  

ZMQ_SNDBUF :设置内核发送缓冲区大小

  ZMQ_SNDBUF选项应将套接字的底层内核传输缓冲区大小设置为指定大小(以字节为单位)。 默认值为-1表示保持操作系统默认值不变。

where man 7 socket says: ( credits go to @Matthew Slatery )

[...]

SO_SNDBUF
          Sets or gets the maximum socket send buffer in bytes.  The  ker-
          nel doubles this value (to allow space for bookkeeping overhead)
          when it is set using setsockopt(), and  this  doubled  value  is
          returned  by  getsockopt().   The  default  value  is set by the
          wmem_default sysctl and the maximum allowed value is set by  the
          wmem_max sysctl.  The minimum (doubled) value for this option is
          2048.
[...]

NOTES
   Linux assumes that half of the send/receive buffer is used for internal
   kernel structures; thus the sysctls are twice what can be  observed  on
   the wire.
[...]

  

ZMQ_SNDHWM :为出站邮件设置高水位标记

  ZMQ_SNDHWM选项应为指定套接字上的出站消息设置高水位标记。高水位标记是对于指定套接字正在与之通信的任何单个对等方,ØMQ应在内存中排队的未完成消息的最大数量的硬限制非默认值为零意味着没有限制。

  如果已达到此限制,则套接字应进入异常状态,并且根据套接字类型,ØMQ应采取适当的操作,例如阻止或丢弃已发送的消息。有关每种插座类型采取的确切措施的详细信息,请参阅zmq_socket(3)中的各个插座说明。

  ØMQ保证套接字将接受ZMQ_SNDHWM个消息,并且实际限制可能会低多达60-70%,具体取决于套接字上的消息流。

Verba docent,Exempla trahunt:

进行基础架构设置, zmq.PUB 一侧将所有设置保留为默认值,此类发件人将拥有约20,200,2000 zmq.SUB 支持发送者的abonents,很快就会耗尽默认的,未经修改的O / S内核缓冲区空间,因为每个 .bind()/.connect() 关系(每个abonent)会尝试“填充“一旦以~ 1000 * aVarMessageSIZE [Bytes]方式播放,”就像 .send( ..., ZMQ_DONTWAIT ) 数据的总累积总和一样多。如果O / S没有提供足够的缓冲空间 - 我们去 -

  

“休斯顿,我们遇到问题......”

如果邮件无法在套接字上排队,则 zmq_send() 功能失败 errno 设置为 EAGAIN

<强> Q.E.D。