答案 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%,具体取决于套接字上的消息流。
进行基础架构设置, 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。强>