В zeromq
параметрах сокета у нас есть флаги как для максимальной отметки, так и для размер буфера.
Для отправки это ZMQ_SNDHWM
и ZMQ_SNDBUF
.
Кто-нибудь может объяснить разницу между ними?
В zeromq
параметрах сокета у нас есть флаги как для максимальной отметки, так и для размер буфера.
Для отправки это ZMQ_SNDHWM
и ZMQ_SNDBUF
.
Кто-нибудь может объяснить разницу между ними?
ZMQ_SNDBUF
: установить размер буфера передачи ядра
ПараметрZMQ_SNDBUF
должен установить размер базового буфера передачи ядра для сокета на указанный размер в байтах. Значение ( default), равное -1, означает, что значение ОС по умолчанию остается без изменений.
где man 7 socket
говорит: ( кредиты принадлежат @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
, слушающих отправителя, вскоре будет исчерпан стандартный немодифицированный буфер ядра операционной системы, так как каждое отношение .bind()/.connect()
(каждый абонент) попытается "наполнить" столько, сколько составляет общая совокупная сумма ~ 1000 * aVarMessageSIZE [Bytes]
< /strong> данных, которые когда-то были переданы .send( ..., ZMQ_DONTWAIT )
образом, и если операционная система не предоставила бы достаточного буферного пространства — вот так —
"Хьюстон, у нас проблема..."
Если сообщение не может быть поставлено в очередь на сокете, функцияzmq_send()
должна отказаться< /strong> сerrno
установленным вEAGAIN
.
QED