ss -tnp muestra cada conexión junto al proceso que la sostiene, y ss -ti añade contadores de bytes por socket. Entre los dos obtienes el tráfico atribuido a un proceso sin instalar nada, lo que importa en un servidor donde eres invitado, dentro de un contenedor, o en cualquier sitio donde no tengas root para añadir paquetes.
1. Quién está conectado y de quién es el proceso
$ clai muestra las conexiones establecidas con sus procesos→ 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))
La columna Process te da el nombre y el pid directamente. Un Send-Q de cuatro megabytes en el lado emisor son datos que la aplicación ya escribió y la red todavía no se ha llevado: señal fiable de que ese socket es el que llena el tubo.
2. Cuántos bytes pasaron por un socket
$ clai muestra cuántos bytes pasaron por esta conexión→ ss -tin 'dport = :8099' | grep -oE 'bytes_sent:[0-9]+|bytes_received:[0-9]+'bytes_sent:85bytes_received:8579963
Esta es la parte que conviene saber. -i añade estadísticas internas de TCP, que incluyen contadores de bytes por socket. Eso es "tráfico por proceso" sin nethogs, porque el comando anterior ya ató el socket a un pid.
3. Totales del interfaz
$ clai muestra los contadores de tráfico del interfaz lo→ grep -E '^\s*lo:' /proc/net/dev | awk '{print "rx_bytes="$2, "tx_bytes="$10}'rx_bytes=581097986 tx_bytes=581097986
/proc/net/dev existe en cualquier sistema Linux, contenedores incluidos. Son contadores desde el arranque, así que por sí solos no significan nada: el significado está en la diferencia entre dos lecturas.
4. Caudal durante un segundo
$ clai mide la velocidad de transferencia en lo durante un 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
Dos lecturas separadas por un segundo: ese es todo el principio de cualquier medidor de ancho de banda. Cambia lo por eth0 o enp5s0.
5. Procesos con más conexiones
$ clai muestra qué procesos tienen más conexiones→ ss -tnp | awk 'NR>1 {match($0,/"[^"]+"/); if (RSTART) print substr($0,RSTART+1,RLENGTH-2)}' | sort | uniq -c | sort -rn | head -5
El número de conexiones no es tráfico, pero es un buen primer corte: un proceso con cien sockets salta a la vista. Después mira los contadores de bytes del paso 2 para tu sospechoso.
6. Verlo en movimiento
$ clai refresca la lista de conexiones cada segundo→ watch -n1 "ss -tnp state established"
ss no tiene modo de repetición propio, así que lo pone watch. Es el pariente pobre de iftop, disponible en cualquier máquina en la que entres.
Gotchas
- El número de conexiones no es ancho de banda. Un socket puede tirar de gigabytes mientras cien conexiones keep-alive ociosas no mueven nada. Las conexiones encuentran al sospechoso; los contadores de
ss -tison la prueba. - Sin root solo ves tus propios procesos. La columna Process se rellena para sockets de otros usuarios únicamente con
sudo. Un campo vacío junto a una conexión ajena significa "no es tu proceso", no "no hay proceso". - Los contadores del interfaz incluyen todo lo de la máquina.
/proc/net/devtambién cuenta actualizaciones de paquetes, agentes de monitorización y contenedores vecinos. Para una respuesta precisa mira el socket, no el interfaz.
Related questions
¿Cuándo merece la pena instalar nethogs? Cuando necesitas monitorización continua y cómoda por proceso. ss cubre un diagnóstico puntual; mirarlo durante horas es otra cosa.
¿Cómo veo el tráfico de un contenedor? Sus contadores viven en su propio espacio de nombres de red: docker exec <nombre> cat /proc/net/dev muestra exactamente el tráfico de ese contenedor.
¿Cómo distingo un enlace saturado de una aplicación lenta? Una Send-Q que crece a velocidad constante significa que la aplicación escribe más rápido de lo que la red drena. Una Send-Q vacía con poco caudal apunta a la aplicación o al extremo remoto.
See also
- netstat: command not found — usa ss en su lugar
- Medir la latencia de una API con curl
- Comprobar si un puerto está abierto
CliAI construye estos filtros de ss a partir de una frase normal, para que no tengas que recordar la sintaxis. Instálalo en una línea.