ss -tnp mostra cada conexão junto do processo que a segura, e ss -ti acrescenta contadores de bytes por socket. Juntos, dão tráfego atribuído a um processo sem instalar coisa alguma — o que importa num servidor onde você é convidado, dentro de um contêiner, ou em qualquer lugar sem root para acrescentar pacotes.
1. Quem está conectado e de quem é o processo
$ clai mostre as conexões estabelecidas com seus processos→ ss -tnp 'sport = :8099 or dport = :8099'State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 4190912 127.0.0.1:8099 127.0.0.1:52080 users:(("python3",pid=1120102,fd=4))ESTAB 324447 0 127.0.0.1:52080 127.0.0.1:8099 users:(("curl",pid=1120130,fd=4))
A coluna Process entrega nome e pid direto. Um Send-Q de quatro megabytes no lado que envia são dados que a aplicação já escreveu e a rede ainda não levou — sinal confiável de que é esse socket que está enchendo o cano.
2. Quantos bytes passaram por um socket
$ clai mostre quantos bytes passaram por esta conexão→ ss -tin 'dport = :8099' | grep -oE 'bytes_sent:[0-9]+|bytes_received:[0-9]+'bytes_sent:85bytes_received:8579963
Essa é a parte que vale saber. O -i acrescenta estatísticas internas do TCP, e nelas há contadores de bytes por socket. Isso é "tráfego por processo" sem nethogs, porque o comando anterior já amarrou o socket a um pid.
3. Totais da interface
$ clai mostre os contadores de tráfego da interface lo→ grep -E '^\s*lo:' /proc/net/dev | awk '{print "rx_bytes="$2, "tx_bytes="$10}'rx_bytes=581097986 tx_bytes=581097986
O /proc/net/dev existe em qualquer Linux, contêineres inclusive. São contadores desde o boot, então sozinhos não dizem nada — o sentido está na diferença entre duas leituras.
4. Vazão em um segundo
$ clai meça a taxa de transferência na lo durante um segundo→ a=$(awk '/^ *lo:/{print $10}' /proc/net/dev); sleep 1; b=$(awk '/^ *lo:/{print $10}' /proc/net/dev); echo "$(( (b-a)/1024 )) KB/s"4764 KB/s
Duas leituras separadas por um segundo — é esse o princípio inteiro de qualquer medidor de banda. Troque lo por eth0 ou enp5s0.
5. Processos com mais conexões
$ clai mostre quais processos têm mais conexões→ ss -tnp | awk 'NR>1 {match($0,/"[^"]+"/); if (RSTART) print substr($0,RSTART+1,RLENGTH-2)}' | sort | uniq -c | sort -rn | head -5
Quantidade de conexões não é tráfego, mas é um bom primeiro corte: um processo segurando cem sockets salta aos olhos. Depois confira os contadores de bytes do passo 2 para o seu suspeito.
6. Acompanhar em movimento
$ clai atualize a lista de conexões a cada segundo→ watch -n1 "ss -tnp state established"
O ss não tem modo de repetição próprio, então o watch faz esse papel. É o parente pobre do iftop, com a vantagem de existir em toda máquina em que você entrar.
Gotchas
- Número de conexões não é banda. Um socket pode puxar gigabytes enquanto cem conexões keep-alive ociosas não movem nada. As conexões acham o suspeito; os contadores do
ss -tisão a prova. - Sem root você só vê os próprios processos. A coluna Process é preenchida para sockets alheios apenas com
sudo. Campo vazio ao lado de uma conexão de outro significa "não é seu processo", e não "não há processo". - Contadores de interface incluem tudo da máquina. O
/proc/net/devtambém conta atualizações de pacotes, agentes de monitoramento e contêineres vizinhos. Para uma resposta precisa, olhe o socket, não a interface.
Related questions
Quando vale instalar o nethogs afinal? Quando você precisa de monitoramento contínuo e confortável por processo. O ss cobre um diagnóstico pontual; encarar ele por horas é outra história.
Como vejo o tráfego de um contêiner? Os contadores dele ficam no próprio namespace de rede: docker exec <nome> cat /proc/net/dev mostra exatamente o tráfego daquele contêiner.
Como distingo link saturado de aplicação lenta? Uma Send-Q crescendo com taxa estável significa que a aplicação escreve mais rápido do que a rede drena. Send-Q vazia com vazão baixa aponta para a aplicação ou para a ponta remota.
See also
- netstat: command not found — use ss no lugar
- Medir a latência de uma API com curl
- Verificar se uma porta está aberta
O CliAI monta esses filtros do ss a partir de uma frase comum, para você não guardar a sintaxe na cabeça. Instale em uma linha.