Wybacz mi, jeśli nie jest to najlepsze forum dla tego pytania, ale wydaje się bardziej odpowiednie dla jądra niż dla samego programowania.
Piszę skrypt, który odpytuje system o otwarte porty, abyśmy mogli tworzyć wykresy i monitorować statystyki. W tym celu używam polecenia „ss” z pakietu iproute. Jeśli wykonasz ss -s|grep estab
, otrzymasz wynik podobny do tego:
TCP: 296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0
Moje pytanie dotyczy zmiennej timewait, która pokazuje obliczone gniazda w stanie TIME_WAIT. Kiedy próbowałem dowiedzieć się, do jakiego numeru został użyty po ukośniku, stało się to wirującą przygodą w poszukiwaniu kodu źródłowego, co ostatecznie doprowadziło mnie do znalezienia następującego fragmentu:
printf("TCP: %d (estab %d, closed %d, orphaned %d, synrecv %d, timewait %d/%d), ports %d\n",
s.tcp_total + slabstat.tcp_syns + s.tcp_tws,
sn.tcp_estab,
s.tcp_total - (s.tcp4_hashed+s.tcp6_hashed-s.tcp_tws),
s.tcp_orphans,
slabstat.tcp_syns,
s.tcp_tws, slabstat.tcp_tws,
slabstat.tcp_ports
);
Muszę przyznać, że moje wyszukiwanie tego, co miał oznaczać „slabstat”, ostatecznie doprowadziło do mojej wiedzy na temat pamięci podręcznych slab i ich interfejsu raportowania w / proc / slabinfo.
Pytanie: Co tabela slabt ma wspólnego z obliczeniami gniazd TIME_WAIT? Nie rozumiem, dlaczego ta liczba jest zgłaszana, ponieważ za każdym razem, gdy uruchamiam polecenie na każdym serwerze, na którym próbowałem, liczba ta zawsze wynosiła zero.
źródło
Odpowiedzi:
Wygląda na
tcp_tw_buckets
to, że jest ostatecznie odpytywany, co jest strukturą usuniętą z Linuksa 2.6.12Zatem ostatnia liczba prawdopodobnie zawsze wynosiłaby 0, chyba że dotyczy 7-letnich jąder.
Jeśli chodzi o zapytania do płyty, o ile mogę stwierdzić, jest ona absurdalnie szybsza niż inne dostępne metody.
źródło