Сколько памяти в среднем потребляется ядром Linux (в адресном пространстве ядра) для сетевого соединения TCP/IP?
Сколько памяти потребляется ядром Linux для каждого сетевого соединения TCP/IP?
Ответ 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, но это не всегда удается.