
Em um servidor Linux pode-se 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 se o intervalo de monitoramento for grande o suficiente. Mas o que pode ser recomendado como alternativa para um servidor de alta carga?
Responder1
Usando /proc para reduzir a carga de trabalho
eu gosto de acessarvariáveis do kerneldiretamente através de /proc
. Isto é muito eficiente, rápido e amigável ao sistema.
Existe um pseudo arquivo (tabela de variáveis do kernel) chamado /proc/net/tcp
onde a lista de armazenamento do kernel de conexão TCP e escuta. O 6º campo, chamadost
paraestadopoderia conter 0A
para uma entrada de escuta e 01
para uma conexão estabelecida.
ContandoTCP estabelecidoconexões:
Usandogrepgrep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
Usandoestranho
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}'
Usandosed
sed </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l
Tempo de execução
Como esta questão representa um sistema de alta carga de trabalho. Eu fiz um pequeno banco:
Método de resposta por milissegundos grepTecno 2.48 awk sem expressão regular ($4=="01") 2,51 sed | wc 2,67 awk com regexp 2.93 estado ss-neopt estabelecido | wc -l Suprijami 15.14 lsof -i tcp -s tcp:ESTABELECIDO Tonioc 25055.00
Ok, a resposta do Tonioc é muito lenta, mas muito interessante pela sua verbosidade. Claramente não pode ser usado em sistemas de alta carga de trabalho.
Este banco permite que você veja que se ss
for uma ferramenta dedicada muito útil, perguntar /proc
variáveis poderia ser muito mais rápido.
Responder2
Use o comando:
ss -neopt state established
Isso mostrará apenas sessões TCP no ESTABLISHED
estado, sem necessidade de canalização para outros comandos, por isso é super rápido.
ss
é melhor do que netstat
porque o mais antigo netstat
apenas lê procfs que está sujeito a bloqueios de arquivo. ss
na verdade, faz uma consulta dentro do kernel que é tratada pelo escalonador do kernel e sempre retorna informações precisas.
Responder3
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
conforme recomendado emNixCraft.
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
Responder4
Há também o lsof, que pode filtrar por protocolo e estado: por exemplo, para procurar conexões TCP ESTABLISHED:
~# lsof -i tcp -s tcp:ESTABLISHED
então | wc -l para contar. Nota: não experimentei o custo disso com um grande número de conexões.