—
Обсуждение тут
—
скопировано отсюда
В компьютерных сетях протокол пользовательских дейтаграмм (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.
- Попробуйте увеличить их, RedHat предлагает значение 262144 байт
sysctl -w net.core.rmem_default=262144 sysctl -w net.core.rmem_max=262144
- Проверьте изменение и протестируйте его с той же рабочей нагрузкой, которая изначально вызвала срабатывание сигнала тревоги.
root@netdata~ # sysctl net.core.rmem_default net.core.rmem_max net.core.rmem_default=262144 net.core.rmem_max=262144
- Если это изменение подходит для вашей системы, вы можете сделать его постоянным.Поднимите эти записи
net.core.rmem_default=262144
иnet.core.rmem_max=262144
записи ниже/etc/sysctl.conf
. - Перезагрузите настройки 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
- Попробуйте установить это значение не менее 16 МБ для 10GE в целом.
root@netdata~ # sysctl -w kern.ipc.maxsockbuf=16777216
- Проверьте изменение и протестируйте его с той же рабочей нагрузкой, которая изначально вызвала срабатывание сигнала тревоги.
root@netdata~ # sysctl kern.ipc.maxsockbuf kern.ipc.maxsockbuf=16777216
- Если это изменение подходит для вашей системы, вы можете сделать его постоянным.Поднимите эту
kern.ipc.maxsockbuf=16777216
запись под/etc/sysctl.conf
. - Перезагрузите настройки sysctl.
root@netdata~ # /etc/rc.d/sysctl reload