Размер буфера ZeroMQ по сравнению с максимальной отметкой

В zeromq параметрах сокета у нас есть флаги как для максимальной отметки, так и для размер буфера.

Для отправки это ZMQ_SNDHWM и ZMQ_SNDBUF.

Кто-нибудь может объяснить разницу между ними?


person CR7    schedule 04.05.2017    source источник


Ответы (1)


Каждый из них контролирует что-то другое:

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% ниже в зависимости от поток сообщений на сокете.


Verba docent, Exempla trahunt:

Имея настройку инфраструктуры, где сторона zmq.PUB оставляет все настройки в значениях по умолчанию, и у такого отправителя будет около 20, 200, 2000 абонентов zmq.SUB, слушающих отправителя, вскоре будет исчерпан стандартный немодифицированный буфер ядра операционной системы, так как каждое отношение .bind()/.connect() (каждый абонент) попытается "наполнить" столько, сколько составляет общая совокупная сумма ~ 1000 * aVarMessageSIZE [Bytes]< /strong> данных, которые когда-то были переданы .send( ..., ZMQ_DONTWAIT ) образом, и если операционная система не предоставила бы достаточного буферного пространства — вот так —

"Хьюстон, у нас проблема..."

Если сообщение не может быть поставлено в очередь на сокете, функция zmq_send() должна отказаться< /strong> с errno установленным в EAGAIN.

QED

person user3666197    schedule 05.05.2017