Pracuję na oprogramowaniu, które łączy się z serwerem danych w czasie rzeczywistym (za pomocą TCP) i mam przerwane połączenia. Domyślam się, że klienci nie czytają wystarczająco szybko danych pochodzących z serwera. Dlatego chciałbym monitorować moje gniazda TCP. W tym celu znalazłem narzędzie „ss”.
To narzędzie pozwala zobaczyć stan każdego gniazda - oto przykładowy wiersz danych wyjściowych polecenia 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
Moje pytanie brzmi: co oznacza część pamięci? Patrząc na kod źródłowy narzędzia stwierdziłem, że dane pochodzą ze struktury jądra ( sock
in sock.h
). Dokładniej, pochodzi z pól:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Czy ktoś wie, co mają na myśli? Moje domysły to:
rmem_alloc
: rozmiar bufora wejściowegowmem_alloc
: rozmiar bufora wychodzącegosk_forward_alloc
: ???sk->sk_wmem_queued
: ???
Oto moje rozmiary buforów:
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
Odpowiedzi:
sk_forward_alloc
jest przydzieloną do przodu pamięcią, która jest całkowitą pamięcią aktualnie dostępną w przydziale gniazda.sk_wmem_queued
jest ilością pamięci używanej przez bufor wysyłający gniazda w kolejce w kolejce nadawczej i albo nie zostały jeszcze wysłane, albo nie zostały jeszcze potwierdzone.Więcej informacji na temat zarządzania pamięcią TCP można znaleźć w rozdziale 9 architektury, projektowania i wdrażania TCP / IP w systemie Linux Autor: Sameer Seth, M. Ajaykumar Venkatesulu
źródło
sk_wmem_queued
różni się ta definicjask_wmem_alloc
, czy mógłbyś trochę rozwinąć tę kwestię? (Jeśli znasz odpowiedź, dodaj odpowiedź na to pytanie: unix.stackexchange.com/questions/551444/... )Zobacz stronę podręcznika ss.
źródło
Jeśli chodzi o
sk_wmem_queued
isk_wmem_alloc
, zadałem to samo pytanie, więc skopiuję odpowiedź tutaj:Wysłałem e-mail do Erica Dumazeta, który przyczynia się do stosu sieciowego Linuksa, a oto odpowiedź:
Bardzo dobrym dokumentem do zrozumienia, jakie są te trzy typy kolejek (bufor gniazd, kolejka qdisc i kolejka urządzeń), jest ten artykuł (raczej długi) . Krótko mówiąc, gniazdo zaczyna się od wypchnięcia pakietów bezpośrednio do kolejki qdisc, która przesyła je do kolejki urządzeń. Gdy kolejka qdisc jest pełna, gniazdo zaczyna buforować dane we własnej kolejce zapisu.
Więc w zasadzie:
sk_wmem_queues
jest pamięć używana przez bufor pamięci (sock.sk_write_queue
), podczas gdysk_wmem_alloc
jest pamięć wykorzystywana przez pakiety w qdisc i kolejkach urządzeń.źródło