Obtendo a contagem atual de conexões TCP em um sistema

22

Em vez de fazer wc -l /proc/net/tcp, existe uma maneira mais rápida de fazer isso?

Eu só preciso de uma contagem total de conexões TCP.

margarida
fonte
5
Talvez tente #ss -s
11003 Ulrich Dangel
@UlrichDangel legal, é mais rápido lendo sockstat; você pode realmente colocar isso na área de resposta ;-)
daisy

Respostas:

20

Se você deseja apenas obter o número e não precisar de mais detalhes, pode ler os dados /proc/net/sockstat{,6}. Lembre-se de que você deve combinar os dois valores para obter a contagem absoluta de conexões.

Se você deseja obter as informações do próprio kernel, pode usá NETLINK_INET_DIAG-las para obter as informações do kernel sem precisar lê-las em/proc

Ulrich Dangel
fonte
1
Gostaria de ver um teste em um sistema com muitas conexões comparando o desempenho da minha solução versus a solução sugerida acima, que requer aritmética e filtragem adicionais para obter a resposta final, que é apenas um número!
9268 Johan
7

Uma maneira mais rápida? Dessa forma, produz uma resposta em uma fração de segundo, na verdade, leva 0,009 segundos no meu computador!

Você está procurando uma maneira que exija menos digitação? Nesse caso, defina um alias, por exemplo

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

Agora você pode apenas digitar o apelido, por exemplo, tcpcounté o que eu usei no meu exemplo, para obter esse número.

Digite a linha ou adicione-a ao seu .bashrc para que o alias seja definido sempre que você efetuar login.

Para um grande número de conexões, o seguinte pode ser executado um pouco mais rápido (e um pouco mais lento para um número muito pequeno de conexões):

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

Ou talvez ...

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

Ambas as soluções assumem que "wc" não é o ideal para contar apenas o número de linhas. Meus testes mostram que essa suposição é verdadeira.

O primeiro trabalha com a premissa de que o comando tail é realmente bom em descartar dados desnecessários, tanto que compensa a criação de um subcasco extra e o trabalho extra em variáveis ​​de ambiente. Ele aproveita o fato de que as linhas em / proc / net / tcp já estão numeradas para eliminar a necessidade de contar as linhas. A solução final assume que o awk conta bem o suficiente para compensar qualquer desvantagem devido ao carregamento de um programa maior e à criação de vários processos. A solução awk tem o benefício adicional de se encaixar perfeitamente em uma definição simples de alias de uma linha (o que oferece benefícios adicionais por não haver script chamado, portanto, nenhum processo de shell extra é bifurcado, oferecendo vantagem adicional de mili-segundos).

Johan
fonte
1
Eu tenho 40k + conexão onde leva mais de 3 segundos
daisy
2
Hmm, acho que não há uma maneira muito mais rápida do que ler /proc/net/tcp. Você pode tentar netstat -n -t | wc -l, mas meu palpite é que netstat também lê/proc/net/tcp
Kotte
netstat é três vezes mais lento que leitura / proc / net / tcp no meu sistema, mas isso é com um número muito pequeno de conexões; portanto, pode ser que algumas despesas gerais de inicialização sejam atenuadas se o número de conexões for grande. netstat faz com que seja fácil de obter a contagem de conexões em estados diferentes ....
Johan
1
Em um servidor com 16 GB de RAM, agora leva mais de um minuto para fazer um netstat -ntcom cerca de 180.000 conexões. Eu não vejo nenhuma razão pela qual deve ser tão lento ... (leitura /proc/net/tcptambém é muito lento)
Marki555
1
Alguns testes tímidos em uma máquina com conexões de 180k indicam que a awkabordagem é lamentavelmente mais lenta que wc. tailparece estar a par wc.
Felix Frank
-1

Use o ss -scomando para obter a resposta detalhada.

user3894067
fonte