2013-05-09 3 views
9

Какой максимальный размер буфера приема UDP Linux? Я думал, что она ограничена только объемом доступной памяти, но когда я установилLinux UDP Максимальный размер принимаемого буфера

5GB для rmem_max:

echo 5000000000 > /proc/sys/net/core/rmem_max 

и 4 Гб для фактического буфера сокета (в Erlang):

gen_udp:listen(Port, [{recbuf, 4000000000}]) 

Когда я измеряю использование буфера, оно показывает:

# netstat -u6anp | grep 5050 
udp6 1409995136  0 :::5050 :::*  13483/beam.smp 

Я не могу превышать этот 1,4 ГБ. Для меньших размеров буфера, например, 500 МБ, фактический размер буфера соответствует настроенному значению. Моя система - Debian 6.0, на компьютере имеется 50 ГБ оперативной памяти.

+1

Где он говорит, что он ограничен только доступной оперативной памятью? И почему, по-вашему, вам нужен 4-гигабайтный буфер? – EJP

+0

Это не так. Он не говорит, что он ограничен любым другим способом. Мне нужен такой буфер, чтобы избежать потери данных при более длительном просмотре сетевого трафика. –

+1

Напротив. В нем говорится, что ядро ​​может настроить значение, которое вы добавляете вверх или вниз, и советует вам вызвать 'getsockopt()', чтобы узнать, какое значение было фактически выделено. Мне трудно поверить, что вам нужно 4 ГБ для обработки пиков трафика. Наверное, вы должны просто читать быстрее. – EJP

ответ

9

Кажется, что в Linux есть предел. Я пробовал установить rmem_max до 2^32-1 с успехом.

[email protected]:/proc/sys/net/core# echo 2147483647 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    2147483647 

2^32 было слишком много:

[email protected]:/proc/sys/net/core# echo 2147483648 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    -18446744071562067968 

Установка для 5000000000 выходов:

[email protected]:/proc/sys/net/core# echo 5000000000 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    705032704 

я испытал в питоне, что установка и получение сокет получить буфер с

ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize) 
    print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) 

Если 'bufferSize' меньше, чем 1024^3, печатается дважды в «bufferSize», в противном случае оно возвращается к 256.

Значение 705032704 * 2 = 1410065408 близко к 1409995136, полученному netstat.

+0

Действительно, я не проверял фактическое значение, которое помещается в rmem_max. Благодарю. Похоже, что размер буфера ограничен подписью int без явной причины. –

0

2^32-1 (2147483647, максимум 32-битное знаковое целое)

[email protected]@localhost:~# sysctl -w net.core.rmem_max=2147483647 
net.core.rmem_max = 2147483647 

[email protected]:~# sysctl -w net.core.rmem_max=2147483648 
sysctl: setting key "net.core.rmem_max": Invalid argument 
net.core.rmem_max = 2147483648 

Повторяя в файловую систему /proc появляется переполнение при попытке установить большие значения.

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