Подтвердить что ты не робот

Сколько памяти потребляется ядром Linux для каждого сетевого соединения TCP/IP?

Сколько памяти в среднем потребляется ядром Linux (в адресном пространстве ядра) для сетевого соединения TCP/IP?

4b9b3361

Ответ 1

Для используемой памяти подключений TCP зависит от

  • размер sk_buff (внутренняя сетевая структура, используемая ядром linux)

  • буфер чтения и записи для подключения

размер буферов может быть изменен по мере необходимости

[email protected]:~# sysctl -A | grep net | grep mem

проверить эти переменные

они определяют максимальное использование буфера памяти по умолчанию для всех сетевых подключений в ядре

net.core.wmem_max = 131071

net.core.rmem_max = 131071

net.core.wmem_default = 126976

net.core.rmem_default = 126976

они определяют использование буферной памяти для соединений tcp

net.ipv4.tcp_mem = 378528   504704  757056

net.ipv4.tcp_wmem = 4096    16384   4194304

net.ipv4.tcp_rmem = 4096    87380   4194304

указанные три значения являются размерами "min default max". Поэтому для начала использования linux будет использоваться значение по умолчанию для буфера чтения и записи для каждого соединения. По мере увеличения количества соединений эти буферы будут уменьшены [максимально до указанного минимального значения] То же самое относится к максимальному значению буфера.

Эти значения могут быть установлены с помощью этого sysctl -w KEY=KEY VALUE

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

sysctl -w net.ipv4.tcp_rmem='4096 4096 4096'

sysctl -w net.ipv4.tcp_wmem='4096 4096 4096'

Ответ 2

Также зависит от того, на каком слое. В случае сценария с чистым мостом есть только FDB на уровне моста. Когда вступает в действие маршрутизация, есть таблица маршрутизации и FDB/соседний домен IP-уровня. И, наконец, как только локальный сокет находится в игре, у вас есть, конечно, размер окна, буферы сокетов (как отправители, так и получатели, и по умолчанию они имеют значение 128 КБ в последний раз, когда я проверял), списки фрагментов (если они используются), так что память идет, но четкий ответ трудно сделать со всеми используемыми частями. Вы можете использовать ss -m для получения нескольких статистических данных о памяти локальных сокетов потока.

Ответ 3

Это зависит. О многих вещах.
Я думаю, что незанятое соединение займет несколько сотен байтов.
Но если есть данные в данных передачи и/или приема, тогда потребление увеличивается. Размер окна может примерно ограничить это потребление.
Дополнительное потребление данных - это не только байты в очереди приема/передачи. Есть накладные расходы, поэтому сегмент с одним байтом может принимать что-то вроде 2K. TCP пытается уменьшить это, например, путем слияния сегментов в один sk_buff, но это не всегда удается.