2016-10-06 4 views
1

Я реализую собственный протокол дейтаграмм транспортного уровня в ядре Linux. Я реализую отправку и получение очередей для доставки в порядке убывания.Как увеличить распределение памяти сокетов в ядре Linux

Я заметил, что с моей текущей реализацией у моего сокета заканчивается память только с 16 буферами сокетов с полезной нагрузкой BUFSIZ в очереди. Поэтому мне нужно увеличить значение памяти, выделенной для моего сокета.

Я полагал, что изменение значения sk->sk_sendbuf и sk->sk_rcvbuf должно выполнить эту работу. Каков правильный способ сделать это?

P.S.- Я еще не реализовал интерфейс sysctl для этого протокола, поэтому не могу использовать его для управления памятью.

Спасибо.

+0

Что занимает вся память? Если это данные, не является ли фрагментация способом борьбы с этим? – bytefire

+1

Я пытаюсь сохранить границы сообщений, поэтому фрагментация не является вариантом. Что занимает память - это распределение буферов сокетов и когда в очереди есть неустановленные буферы (точнее, 16), я не могу выделить больше буферов с помощью функции 'sock_alloc' в ядре –

ответ

1

Как оказалось, мне не нужно определять интерфейс sysctl вручную для моего протокола. Я просто использовал следующую SYSCTL команды на моей тестовой машине, чтобы увеличить объем памяти, выделенный для каждого сокета

sysctl -w net.core.wmem_default=<new_value> 
sysctl -w net.core.wmem_max=<new_value> 

Чтобы выбрать new_value, я первый проверил существующие значения этих параметров с

sysctl -n net.core.wmem_default 
sysctl -n net.core.wmem_max 

Обратите внимание, что фактическая память, назначенная для сокета, будет в два раза меньше new_value, так как реализация находится в ядре.

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