Я работаю над программным обеспечением, которое подключается к серверу данных в реальном времени (используя TCP), и у меня прерывается соединение. Я предполагаю, что клиенты не читают данные, поступающие с сервера достаточно быстро. Поэтому я хотел бы контролировать мои сокеты TCP. Для этого я нашел инструмент "ss".
Этот инструмент позволяет видеть состояние каждого сокета - вот пример строки вывода команды ss -inm 'src *:50000'
ESTAB 0 0 184.7.60.2:50000 184.92.35.104:1105
mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40
Мой вопрос: что означает часть памяти? Глядя на исходный код инструмента, я обнаружил, что данные поступают из структуры ядра ( sock
в sock.h
). Точнее, это происходит с полей:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Кто-нибудь знает, что они имеют в виду? Мои догадки:
rmem_alloc
: размер входящего буфераwmem_alloc
: размер исходящего буфераsk_forward_alloc
: ???sk->sk_wmem_queued
: ???
Вот мои размеры буферов:
net.ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071
Ответы:
sk_forward_alloc
это выделенная в прямом направлении память, которая является общим объемом памяти, доступной в настоящее время в квоте сокета.sk_wmem_queued
это объем памяти, используемый буфером отправки сокета, поставленным в очередь в очереди на передачу и либо еще не отправленный, либо еще не подтвержденный.Вы можете узнать больше об управлении памятью TCP в главе 9 « Архитектура TCP / IP, проектирование и реализация в Linux». Самер Сет, М. Аджайкумар Венкатесулу
источник
sk_wmem_queued
отличается это определениеsk_wmem_alloc
, не могли бы вы немного рассказать об этом? (Если вы знаете ответ, не стесняйтесь добавлять ответ на этот вопрос: unix.stackexchange.com/questions/551444/… )Смотрите справочную страницу ss.
источник
Что касается
sk_wmem_queued
иsk_wmem_alloc
, я задал тот же вопрос, поэтому я скопирую ответ здесь:Я написал Эрику Думазету, который вносит свой вклад в сетевой стек Linux, и вот ответ:
Очень хорошая статья для понимания того, что представляют собой эти три типа очередей (буфер сокетов, очередь qdisc и очередь устройств), является этой (довольно длинной) статьей . Короче говоря, сокет начинает с отправки пакетов непосредственно в очередь qdisc, которая перенаправляет их в очередь устройств. Когда очередь qdisc заполнена, сокет начинает буферизовать данные в своей собственной очереди записи.
Итак, в основном:
sk_wmem_queues
память, используемая сокетом buffer (sock.sk_write_queue
), аsk_wmem_alloc
память, используемая пакетами в очередях qdisc и device.источник