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

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


person Community    schedule 27.12.2011    source источник
comment
Можете подробнее описать ситуацию? Без него наилучшая оценка, которую кто-либо мог бы дать, была бы где-то между 1K и 10M, что вам мало поможет. Я предполагаю, что вы имеете в виду соединения TCP/IP, где одним концом (сервером?) является ваша машина. Можете ли вы предположить, что соединение в настоящее время простаивает или, по крайней мере, оно не зависло (т. е. все подтверждается в разумные сроки)?   -  person ugoren    schedule 03.01.2012


Ответы (3)


Для TCP-соединения потребляемая память зависит от

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

  2. буфер чтения и записи для соединения

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

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'
person daya    schedule 04.01.2012

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

person jørgensen    schedule 03.01.2012
comment
Можете ли вы объяснить мне 4 символа (r, w, f, t) в выводе ss -m? - person pradeepchhetri; 07.02.2013

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

person ugoren    schedule 27.12.2011