Obtém o número de conexões estabelecidas por TCP

5

Em um servidor Linux, é possível usar netstat -tan | grep ESTABLISHED| wc -l , mas isso não funcionará em um servidor de alta carga com watch -n1 .

Essa abordagem funciona bem se o servidor não estiver muito ocupado ou o intervalo de monitoramento for grande o suficiente. Mas o que pode ser recomendado como alternativa para um servidor de alta carga?

    
por Tinti 24.11.2014 / 19:47

5 respostas

1

Usando o / proc para reduzir a carga de trabalho

Eu gosto de acessar variáveis do kernel diretamente através de /proc . Isso é muito eficiente, rápido e amigável ao sistema.

Existe um pseudo arquivo (tabela de variáveis do kernel) chamado /proc/net/tcp onde lista de armazenamento do kernel de conexão TCP e escuta. O sexto campo, chamado st para estado , pode conter 0A para uma entrada de escuta e 01 para uma conexão estabelecida.

Contando conexões TCP estabelecidas :

Ao usar
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
Ao usar
awk  </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'

ou

awk  </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
Ao usar
sed  </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l

Tempo de execução

Como esta questão significa alto sistema de carga de trabalho. Eu fiz um pequeno banco:

Method                                Answer by     Milliseconds

grep                                  Techno        2.48
awk no regexp ($4=="01")                            2.51
sed | wc                                            2.67
awk with regexp                                     2.93

ss -neopt state established | wc -l   Suprjami     15.14
lsof -i tcp -s tcp:ESTABLISHED        Tonioc    25055.00

A resposta de Ok Tonioc é muito lenta, mas muito interessante por sua verbosidade. Então, claramente não é utilizável no sistema de alta carga de trabalho.

Este banco permite que você veja se ss é uma ferramenta dedicada muito útil, pedir /proc variáveis pode ser muito mais rápido.

    
por 25.11.2014 / 10:56
7

Use o comando:

ss -neopt state established

Isso mostrará apenas sessões TCP em ESTABLISHED state, sem canalizar outros comandos necessários, por isso é super rápido.

ss é melhor que netstat porque o antigo netstat apenas lê o procfs que está sujeito a bloqueios de arquivo. ss faz uma consulta dentro do kernel que é manipulado pelo agendador do kernel e sempre retorna informações precisas.

    
por 25.11.2014 / 12:45
1

Verifique também: 527875 .

netstat + grep é uma opção boa e simples para algumas conexões, mas se você tiver um grande número de conexões, eu recomendaria ss como recomendado em nixCraft .

Por exemplo: ss -s

Total: 78 (kernel 79)
TCP:   31 (estab 27, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 16

Transport Total     IP        IPv6
*     79        -         -        
RAW   0         0         0        
UDP   4         2         2        
TCP   31        2         29       
INET      35        4         31       
FRAG      0         0         0  
    
por 24.11.2014 / 19:47
0

ss é uma boa ferramenta. Por diversão, você também pode:

[kbrandt@ny-kbrandt01: ~] cat /proc/net/snmp | grep Tcp | awk '{print $10}'
CurrEstab
3
    
por 25.11.2014 / 06:09
0

Há também o lsof, que pode filtrar por protocolo e estado: por exemplo, para procurar por conexões TCP ESTABLISHED:

~# lsof -i tcp -s tcp:ESTABLISHED

então | wc -l para contar. Nota: não tentei o custo disso com um grande número de conexões.

    
por 25.11.2014 / 10:31