Uzyskiwanie bieżącej liczby połączeń TCP w systemie

22

Czy zamiast robić wc -l /proc/net/tcpto szybciej?

Potrzebuję tylko całkowitej liczby połączeń TCP.

stokrotka
źródło
5
Może spróbujss -s
Ulrich Dangel
@UlrichDangel spoko, to szybciej, czytając sockstat; możesz to umieścić w polu odpowiedzi ;-)
stokrotka

Odpowiedzi:

20

Jeśli chcesz tylko uzyskać numer i nie potrzebujesz żadnych szczegółów, możesz odczytać dane /proc/net/sockstat{,6}. Pamiętaj, że musisz połączyć obie wartości, aby uzyskać bezwzględną liczbę połączeń.

Jeśli chcesz uzyskać informacje z samego jądra, możesz użyć, NETLINK_INET_DIAGaby uzyskać informacje z jądra bez konieczności odczytywania go z/proc

Ulrich Dangel
źródło
1
Byłbym ciekawy testu systemu z wieloma połączeniami, porównującego wydajność mojego rozwiązania z wyżej sugerowanym rozwiązaniem, które wymaga dodatkowej arytmetyki i filtrowania, aby uzyskać ostateczną odpowiedź, która jest tylko jedną liczbą!
Johan
7

Szybszy sposób? W ten sposób powstaje odpowiedź w ułamku sekundy, w rzeczywistości zajmuje to 0,009 sekundy na moim komputerze!

Szukasz sposobu, który wymaga mniej pisania? W takim przypadku ustaw alias, np

alias tcpcount="wc -l /proc/net/tcp"

Możesz teraz po prostu wpisać alias, np. tcpcountTo, co użyłem w moim przykładzie, aby uzyskać ten numer.

Wpisz wiersz lub dodaj go do swojego .bashrc, aby alias był definiowany przy każdym logowaniu.

W przypadku dużej liczby połączeń następujące czynności mogą działać nieco szybciej (i nieco wolniej w przypadku bardzo małej liczby połączeń):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

Albo może ...

awk 'END {print NR}' /proc/net/tcp

Oba te rozwiązania zakładają, że „wc” nie jest zbyt optymalne do zliczania liczby linii. Moje testy pokazują, że to założenie jest prawdziwe.

Pierwszy opiera się na założeniu, że polecenie tail jest naprawdę dobre w usuwaniu niepotrzebnych danych, do tego stopnia, że ​​rekompensuje to tworzenie dodatkowej podpowłoki i wykonywanie dodatkowej pracy na zmiennych środowiskowych. Wykorzystuje fakt, że linie w / proc / net / tcp są już ponumerowane, aby wyeliminować konieczność liczenia linii. Ostateczne rozwiązanie zakłada, że ​​awk liczy się wystarczająco dobrze, aby zrównoważyć wszelkie niedogodności wynikające z załadowania większego programu w porównaniu do tworzenia wielu procesów. Rozwiązanie awk ma tę dodatkową zaletę, że ładnie pasuje do prostej, jednoliniowej definicji aliasu (co daje dodatkowe korzyści polegające na tym, że nie ma wywoływanego skryptu, a zatem nie rozwidla się dodatkowych procesów powłoki, co daje dodatkową korzyść w postaci miliardowych sekund).

Johan
źródło
1
Mam połączenie 40k +, gdzie zajmuje to więcej niż 3 sekundy
stokrotka
2
Hmm, nie sądzę, że jest o wiele szybszy sposób niż czytanie /proc/net/tcp. Możesz spróbować netstat -n -t | wc -l, ale zgaduję, że netstat również czyta z/proc/net/tcp
Kotte
netstat jest ponad 3 razy wolniejszy niż odczyt / proc / net / tcp w moim systemie, ale dotyczy to bardzo małej liczby połączeń, więc może się zdarzyć, że narzut związany z uruchomieniem zostanie zmniejszony, jeśli liczba połączeń będzie duża. netstat ułatwia obliczanie liczby połączeń w różnych stanach ...
Johan
1
Na serwerze z 16 GB pamięci RAM wykonanie netstat -ntokoło 180 000 połączeń zajmuje teraz więcej niż minutę . Nie widzę powodu, dla którego powinien być tak wolny ... (czytanie /proc/net/tcpjest również bardzo wolne)
Marki555 30.01.2014
1
Niektóre nieśmiałe testy na maszynie z połączeniami 180k wskazują, że awkpodejście jest znacznie wolniejsze niż wc. tailwydaje się być na równi wc.
Felix Frank
-1

Użyj ss -spolecenia, aby uzyskać szczegółową odpowiedź.

użytkownik3894067
źródło