2010-08-30 2 views
3

Я запускаю x86_64 RedHat 5.3 (ядро 2.6.18) и смотрю конкретно на net.core.rmem_max из sysctl -a в контексте попытки установить буферы UDP. Приложение-получатель иногда пропускает пакеты, но я думаю, что буфер уже достаточно большой, в зависимости от того, что он означает:Каковы единицы буферов UDP и где docs для параметров sysctl?

Каковы единицы этого параметра - биты, байты, пакеты или страницы? Если биты или байты, это из дейтаграммы/полезной нагрузки (например, 100 байт) или размер сетевого MTU (~ 1500 байт)? Если страницы, каков размер страницы в байтах?

И это максимальная для каждой системы на физическое устройство (NIC), для каждого виртуального устройства (VLAN), для каждого процесса, для каждого потока, для каждого сокета/для группы мультивещания?

Например, предположим, что мои данные составляют 100 байт на каждое сообщение, и каждый сетевой пакет содержит 2 сообщения, и я хочу иметь возможность буферизации 50 000 сообщений на один сокет, и я открываю 3 сокета на поток по каждому из 4 потоков. Насколько велика должна быть net.core.rmem_max? Аналогично, когда я устанавливаю параметры сокета внутри приложения, это байты полезной нагрузки единиц, поэтому 5000000 на каждый сокет в этом случае?

Наконец, в общем, как бы я нашел детали единиц для параметров, которые я вижу через sysctl -a? У меня есть аналогичные единицы и по X вопросам о других параметрах, таких как net.core.netdev_max_backlog и net.ipv4.igmp_max_memberships.

спасибо.

ответ

2

Вы бы просмотрели документы these. Тем не менее, многие из этих параметров действительно плохо документированы, поэтому ожидайте, что som googling выкопает детали gory из блогов и списков рассылки.

rmem_max - максимальный буфер для каждого сокета в байтах. Копаясь, это, как представляется, память, в которой получены все пакеты, поэтому размер должен включать размеры любых заголовков/ip/udp, хотя эта область для меня довольно нечеткая.

Имейте в виду, что UDP является ненадежным. Существует множество источников потерь, не в последнюю очередь между коммутаторами и маршрутизаторами - у них также есть буферы.

1

Он полностью задокументирован в справочной странице сокета (7) (он находится в байтах).

Кроме того, предел может устанавливаться на основе каждого сокета с помощью SO_RCVBUF (как указано на той же странице).

Прочтите справочные страницы сокетов (7), ip (7) и udp (7) для получения информации о том, как эти вещи действительно работают. Там описаны документы sysctls.

Смежные вопросы