ss -tnp zeigt jede Verbindung samt dem Prozess, der sie hält, und ss -ti ergänzt Bytezähler je Socket. Zusammen ergibt das Traffic mit Prozesszuordnung, ohne irgendetwas zu installieren — wichtig auf einem Server, auf dem Sie Gast sind, in einem Container und überall, wo Ihnen root für Pakete fehlt.
1. Wer ist verbunden, und wessen Prozess ist das
$ clai zeige aufgebaute verbindungen mit ihren prozessen→ 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))
Die Spalte Process liefert Name und PID direkt. Vier Megabyte Send-Q auf der Senderseite sind Daten, die die Anwendung bereits geschrieben hat und das Netz noch nicht abgeholt hat — ein verlässliches Zeichen, dass genau dieser Socket die Leitung füllt.
2. Wie viele Bytes durch einen Socket gingen
$ clai zeige wie viele bytes über diese verbindung liefen→ ss -tin 'dport = :8099' | grep -oE 'bytes_sent:[0-9]+|bytes_received:[0-9]+'bytes_sent:85bytes_received:8579963
Das ist der Teil, den man kennen sollte. -i ergänzt interne TCP-Statistik, und darin stecken Bytezähler je Socket. Das ist "Traffic pro Prozess" ohne nethogs, denn der vorige Befehl hat den Socket bereits an eine PID gebunden.
3. Summen der Schnittstelle
$ clai zeige die traffic-zähler der schnittstelle 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 gibt es auf jedem Linux, Container eingeschlossen. Es sind Zähler seit dem Start, für sich genommen also bedeutungslos — der Sinn steckt in der Differenz zweier Messungen.
4. Durchsatz über eine Sekunde
$ clai miss die übertragungsrate auf lo über eine sekunde→ 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
Zwei Messungen im Abstand einer Sekunde — das ist das ganze Prinzip hinter jedem Bandbreitenmesser. lo durch eth0 oder enp5s0 ersetzen.
5. Prozesse mit den meisten Verbindungen
$ clai zeige welche prozesse die meisten verbindungen halten→ ss -tnp | awk 'NR>1 {match($0,/"[^"]+"/); if (RSTART) print substr($0,RSTART+1,RLENGTH-2)}' | sort | uniq -c | sort -rn | head -5
Die Verbindungszahl ist kein Traffic, aber ein brauchbarer erster Schnitt: ein Prozess mit hundert Sockets fällt sofort auf. Danach prüfen Sie beim Verdächtigen die Bytezähler aus Schritt 2.
6. In Bewegung beobachten
$ clai aktualisiere die verbindungsliste jede sekunde→ watch -n1 "ss -tnp state established"
ss hat keinen eigenen Wiederholmodus, den liefert watch. Der arme Verwandte von iftop — dafür auf jeder Maschine vorhanden, auf der Sie sich je anmelden.
Gotchas
- Verbindungszahl ist keine Bandbreite. Ein Socket kann Gigabyte ziehen, während hundert leerlaufende Keep-alive-Verbindungen nichts bewegen. Verbindungen finden den Verdächtigen, die Zähler aus
ss -tisind der Beweis. - Ohne root sehen Sie nur eigene Prozesse. Die Spalte Process wird für fremde Sockets nur mit
sudogefüllt. Ein leeres Feld neben fremder Verbindung heißt "nicht dein Prozess", nicht "kein Prozess". - Schnittstellenzähler enthalten alles auf der Maschine. In
/proc/net/devlanden auch Paketupdates, Monitoring-Agenten und Nachbarcontainer. Für eine genaue Antwort schauen Sie auf den Socket, nicht auf die Schnittstelle.
Related questions
Wann lohnt sich nethogs dann doch? Wenn Sie dauerhaftes, bequemes Monitoring pro Prozess brauchen. Eine einmalige Diagnose deckt ss vollständig ab; stundenlang hineinschauen ist etwas anderes.
Wie sehe ich den Traffic eines Containers? Seine Zähler liegen im eigenen Netzwerk-Namensraum: docker exec <name> cat /proc/net/dev zeigt exakt den Traffic dieses Containers.
Wie unterscheide ich eine volle Leitung von einer langsamen Anwendung? Wachsende Send-Q bei gleichbleibender Rate heißt, die Anwendung schreibt schneller, als das Netz abnimmt. Leere Send-Q bei geringem Durchsatz deutet auf die Anwendung oder die Gegenstelle.
See also
CliAI baut diese ss-Filter aus einem normalen Satz, damit Sie die Syntax nicht im Kopf behalten müssen. In einer Zeile installieren.