Сколько памяти в среднем потребляет ядро Linux (в адресном пространстве ядра) на одно сетевое соединение TCP/IP?
Сколько памяти потребляет ядро Linux на одно сетевое соединение TCP/IP?
Ответы (3)
Для TCP-соединения потребляемая память зависит от
размер sk_buff (внутренняя сетевая структура, используемая ядром Linux)
буфер чтения и записи для соединения
размер буферов можно настроить по мере необходимости
root@x:~# 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'
Также зависит от того, какой слой. В случае сценария чистого моста есть только FDB уровня моста. Когда в игру вступает маршрутизация, есть таблица маршрутизации и база данных FDB/neighbor db на уровне IP. И, наконец, как только локальный сокет находится в игре, у вас, конечно же, есть размер окна, буферы сокетов (как для отправки, так и для приема, и они по умолчанию равны 128 КБ, когда я проверял в прошлый раз), списки фрагментов (если они использовались), так что это то, где ваш память идет, но четкий ответ трудно дать со всеми используемыми частями. Вы можете использовать ss -m
для получения статистики памяти локальных сокетов потока.
ss -m
?
- person pradeepchhetri; 07.02.2013
Это зависит. На многих-многих вещах.
Я думаю, что простое соединение займет несколько сотен байтов.
Но если есть данные в передаваемых и/или принимаемых данных, то потребление увеличивается. Размер окна может примерно ограничить это потребление.
Дополнительное потребление данных — это не только байты в очереди приема/передачи. Существуют накладные расходы, поэтому сегмент с одним байтом может занимать около 2 КБ. TCP пытается уменьшить это, например, объединяя сегменты в один sk_buff, но это не всегда удается.