1m_ipv4_udp_receive_buffer_errors netdata

Linux admin

Обсуждение тут

скопировано отсюда

В компьютерных сетях протокол пользовательских дейтаграмм (UDP) является одним из основных членов семейства интернет-протоколов.

В вариантах Linux и FreeBSD ядро ​​выделяет буферы для обслуживания операций протокола UDP. Пакеты после приема с сетевого интерфейса пересылаются в эти буферы для обработки стеком протокола UDP в системном сокете.

Netdata Agent отслеживает среднее количество ошибок буфера приема UDP за последнюю минуту. Получение этого оповещения означает, что ваша система отбрасывает входящие пакеты UDP. Это может означать, что очередь буфера приема UDP заполнена.

Это оповещение срабатывает в состоянии предупреждения, когда количество ошибок буфера приема UDP за последнюю минуту превышает 10.Подробнее о протоколе UDPСсылки и источники

ОС: Linux

Размеры приемного буфера для UDP контролируются 4 переменными.  

  • net.core.rmem_default, настройка по умолчанию приемного буфера сокета в байтах.
  • net.core.rmem_max, максимальный размер буфера сокета приема в байтах. Каждый сокет получает rmem_defaultразмер буфера приема по умолчанию и может запросить до rmem_maxс setsockoptопцией SO_RCVBUF.
  • net.ipv4.udp_mem, это вектор из трех целых чисел (мин, давление, макс), определяющий количество страниц, разрешенных для постановки в очередь всеми сокетами UDP.
  • net.ipv4.udp_rmem_min, минимальный размер (в байтах) буфера приема, используемого сокетами UDP в режиме модерации. Каждый сокет UDP может использовать этот размер для приема данных, даже если общее количество страниц сокетов UDP превышает давление udp_mem.

В целом, проблемы с динамически выделяемыми буферами коррелируют с
памятью ядра, вы всегда должны быть в курсе событий давления памяти. Это может привести к ошибкам буфера.

Раздел устранения неполадок:

Увеличьте значения net.core.rmem_default и net.core.rmem_max.

  1. Попробуйте увеличить их, RedHat предлагает значение 262144 байт  sysctl -w net.core.rmem_default=262144 sysctl -w net.core.rmem_max=262144
  2. Проверьте изменение и протестируйте его с той же рабочей нагрузкой, которая изначально вызвала срабатывание сигнала тревоги.root@netdata~ # sysctl net.core.rmem_default net.core.rmem_max net.core.rmem_default=262144 net.core.rmem_max=262144
  3. Если это изменение подходит для вашей системы, вы можете сделать его постоянным.Поднимите эти записи net.core.rmem_default=262144и net.core.rmem_max=262144записи ниже /etc/sysctl.conf.
  4. Перезагрузите настройки sysctl.root@netdata~ # sysctl -p

ОС: FreeBSD

На буферное пространство для любого UDP-соединения на FreeBSD влияют следующие параметры, как упомянул Авасихба в своем личном блоге. 4

  • net.inet.udp.recvspace, когда вы открываете любой сокет UDP, этот параметр определяет размер буфера приема по умолчанию для данных пользовательского пространства для этого сокета. Вы можете переопределить этот размер с помощью setsockoptв вашем коде.
  • kern.ipc.maxsockbuf, буферное пространство для сокета, определяется этим параметром. Поэтому, если вы пытаетесь открыть сокет с большим буфером отправки и приема и получаете ошибку типа «нет доступного буферного пространства», то вам следует рассмотреть возможность настройки kern.ipc.maxsockbuf. Иногда вы видите частые сбросы UDP при работе с большим количеством маленьких пакетов UDP. Даже если ваш recvspaceбуфер не заполнен полностью, вы все равно будете терять пакеты. Покопавшись некоторое время, мы выяснили, что это происходит из-за того, что мы достигли другого жесткого предела sockbuf->sb_mbmax, он определяет максимальное количество mbufsвыделенных для каждого сокета. Вы можете увеличить этот предел, увеличив kern.ipc.maxsockbuf. Вам нужно перезапустить связанные службы, чтобы применить этот параметр.
  • kern.ipc.nmbcluster, этот параметр управляет общим объемом памяти, который вам необходимо выделить для всех открытых сокетов в вашей системе. Это значение определяет, сколько кластеров mbuf должно быть выделено. Обычно каждый кластер имеет размер 2k. Например, если вы планируете открыть 1000 сокетов, каждый из которых будет иметь 8k отправляющего и 8k принимающего буферов, каждому сокету потребуется 16k памяти, и в общей сложности вам потребуется 16M (16k x 1000) памяти для обработки всех 1000 соединений.

В целом, проблемы с динамически выделяемыми буферами коррелируют с памятью ядра, вы всегда должны быть в курсе событий давления памяти. Это может привести к ошибкам буфера.

Раздел устранения неполадок:

Увеличьте значение kern.ipc.maxsockbuf​​

  1. Попробуйте установить это значение не менее 16 МБ для 10GE в целом.root@netdata~ # sysctl -w kern.ipc.maxsockbuf=16777216
  2. Проверьте изменение и протестируйте его с той же рабочей нагрузкой, которая изначально вызвала срабатывание сигнала тревоги.root@netdata~ # sysctl kern.ipc.maxsockbuf kern.ipc.maxsockbuf=16777216
  3. Если это изменение подходит для вашей системы, вы можете сделать его постоянным.Поднимите эту kern.ipc.maxsockbuf=16777216запись под /etc/sysctl.conf.
  4. Перезагрузите настройки sysctl.root@netdata~ # /etc/rc.d/sysctl reload