ZeroMQ 缓冲区大小与高水位线

CR7*_*CR7 6 zeromq pyzmq

zeromq 套接字选项中,我们有高水位线和缓冲区大小的标志。

对于发送,它是ZMQ_SNDHWMZMQ_SNDBUF

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

use*_*197 7

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

\n\n
\n

ZMQ_SNDBUF: 设置内核传输缓冲区大小

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

\n
\n\n

其中man 7 socket说:( 学分转到@Matthew Slatery)

\n\n
[...]\n\nSO_SNDBUF\n          Sets or gets the maximum socket send buffer in bytes.  The  ker-\n          nel doubles this value (to allow space for bookkeeping overhead)\n          when it is set using setsockopt(), and  this  doubled  value  is\n          returned  by  getsockopt().   The  default  value  is set by the\n          wmem_default sysctl and the maximum allowed value is set by  the\n          wmem_max sysctl.  The minimum (doubled) value for this option is\n          2048.\n[...]\n\nNOTES\n   Linux assumes that half of the send/receive buffer is used for internal\n   kernel structures; thus the sysctls are twice what can be  observed  on\n   the wire.\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而

\n\n
\n

ZMQ_SNDHWM: 设置出站消息的高水位线

\n 该ZMQ_SNDHWM选项将为指定套接字上的出站消息设置高水位线。高水位线是对与指定套接字正在通信的任何单个对等点在内存中排队的未完成消息最大数量的硬性限制。非默认值表示没有限制。

\n 如果达到此限制,套接字应进入异常状态,并且根据套接字类型,\xc3\x98MQ 应采取适当的操作,例如阻止或丢弃发送的消息。有关每种套接字类型所采取的确切操作的详细信息,请参阅zmq_socket(3)中的各个套接字描述。

\n \xc3\x98MQ 不保证套接字将接受尽可能多的ZMQ_SNDHWM消息,实际限制可能会低 60-70%,具体取决于套接字上的消息流。

\n
\n\n
\n\n

语言讲解员,示例 trahunt:

\n\n

在基础设施设置中,zmq.PUB一方将所有设置保留为默认值,这样的发送方将有大约 20、200、2000 个zmq.SUBabonents 监听发送方,很快就会耗尽默认的、未修改的 O/S 内核缓冲区空间,如下所示每个关系(每个 abonent )一旦在一个广播中广播,.bind()/.connect()就会尝试“填充”与数据的总累积和一样多的数据。~ 1000 * aVarMessageSIZE [Bytes].send( ..., ZMQ_DONTWAIT )并且如果操作系统无法提供足够的缓冲区空间- 我们就这样--

\n\n
\n

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

如果消息无法在套接字上排队,则该zmq_send()函数将失败errno设置为EAGAIN

\n
\n\n

量子电动力学

\n