Gibt es ein Tool, mit dem die Bandbreitennutzung eines einzelnen Prozesses überwacht werden kann?

15

Ich habe einen schönen Monitor gefunden , mit dem ich eine Vielzahl von Laufzeitdaten eines einzelnen Prozesses protokollieren kann. Ich bin auf der Suche nach einem Äquivalent, das das gleiche für die Bandbreitennutzung tut. Im Idealfall sollte der Befehl so aussehen bwmon --pid 1 --log init.log. Gibt es so etwas? Kann es ohne Administratorrechte ausgeführt werden?

Tshepang
quelle

Antworten:

3

Etwas, das Ihnen den Einstieg erleichtert (nur für den Fall, dass Sie es selbst schreiben möchten):

#!/bin/bash
#
# usage: bwmon PID

IN=0; OUT=0; TIME=0

get_traffic() {
    t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
    IN=${t#*,}; IN=${IN%,*}
    OUT=${t##*,};
    TIME=${t%%,*};
}

get_traffic $1
while true
do
    _IN=$IN; _OUT=$OUT; _TIME=$TIME
    get_traffic $1
    echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
    sleep 1
done

Bemerkungen:

  • prüft nur eth0
  • Überprüft alle 1 Sekunde
  • funktioniert nur unter Linux, aber andere Unixe funktionieren ähnlich (procfs oder was auch immer)
  • Die Ausgabe könnte in einer sqlite.db mit gespeichert werden stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
Akira
quelle
11
Ich denke nicht, dass dies tatsächlich ein Zähler pro Prozess ist. Ich denke, es ist nur die Gesamtanzahl der Schnittstellen aus der Sicht des Prozesses. Ich habe ein Client / Server- ncPaar über localhost ausgeführt, ein Byte pro Sekunde gesendet und zugesehen /proc/<listening-nc-pid>/net/dev. Dann lief ich ein zweites ncPaar und sendete mit maximaler Geschwindigkeit. Die Datei, die ich gerade betrachtete, zählte ganz offensichtlich die Daten des zweiten Paares zusammen mit den Daten des ersten Paares. Laufen unter Linux 2.6.32.
Jander
Ich hatte einen Fehler function strftime never defined. Es wurde durch die Installation von Gawk behoben .
Tshepang
4
@Jander Das ist richtig /proc/<pid>/net/devund /proc/net/devhabe hier den gleichen Inhalt. Daher meldet der Scipt den Datenverkehr nur für eth0, nicht für den angegebenen Prozess.
Scai
1
Bestätigung, dass dies keine Antwort ist. Es misst den Schnittstellenzähler für eth0, wie aus dem Prozess ersichtlich. Es ist nicht Zähldaten durch den Prozess durch diese Schnittstelle gesendet.
Navin
@ Navin eine Antwort ist alles, was versucht, die Frage zu beantworten. Eine falsche Antwort ist immer noch eine Antwort. Wenn dies falsch ist, können Sie es ablehnen, aber es ist immer noch eine Antwort.
terdon
6

Wenn Sie mit der verwendeten allgemeinen E / A-Bandbreite zufrieden sind (oder wenn Ihr Programm fast ausschließlich Netzwerk-E / A ausführt), können Sie sich die /proc/<pid>/ioDatei ansehen . Sie möchten die Felder rcharund wchar. Vielleicht möchten Sie subtrahieren read_bytesund write_bytes, da sie repräsentieren liest und schreibt in der Speicherschicht. Siehe Abschnitt 3.3 von http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Wenn Sie mehr Auflösung benötigen ... könnten Sie dies vielleicht mit lsofund skripten strace, obwohl es schmerzhaft wäre, alle Eckfälle richtig zu machen. Die Grundidee ist die Ausgabe zu analysieren strace -p <pid>, packte den ersten Parameter (= den Dateideskriptor) und den Rückgabewert (= Anzahl der Bytes) aus read(), write(), send()und recv()Anrufe ( Hinweis gibt es mehrere weitere syscalls zu hören, ich haven‘ t sie alle aufspüren). Negative Werte verwerfen; Sie weisen auf Fehler hin. Verwenden Sie lsof -p <pid>diese Option, um herauszufinden, welche Dateideskriptoren TCP / UDP-Sockets sind, und addieren Sie die Anzahl pro fd. Diese Strategie erfordert keine Wurzel, solange Sie den Prozess besitzen, den Sie untersuchen, aber es wäre wirklich haarig zu schreiben, geschweige denn gut zu schreiben.

Jander
quelle
3

versuche Nethogs :

NetHogs ist ein kleines 'Net Top'-Tool. Anstatt den Datenverkehr nach Protokollen oder Subnetzen aufzuteilen, gruppiert es die Bandbreite nach Prozessen, wie es die meisten Tools tun. NetHogs benötigt kein spezielles Kernelmodul, um geladen zu werden. Wenn plötzlich viel Netzwerkverkehr auftritt, können Sie NetHogs starten und sofort sehen, welche PID dies verursacht. Dies macht es einfach, Programme zu identifizieren, die wild geworden sind und plötzlich Ihre Bandbreite beanspruchen.
Akira
quelle
2
Leider kann es keinen einzelnen Prozess überwachen und es wird nicht protokolliert. Die zweite Anforderung (Protokollierung) ist jedoch viel wichtiger als die erste. Oh, und es läuft nicht ohne Administratorrechte :(
Tshepang
1
Mit ziemlicher Sicherheit benötigen Sie dafür Root-Rechte.
Falmarri
Sie können versuchen, Nethogs mit dem Flag -t (Tracemode) zu verwenden. Die resultierende Ausgabe könnte dann analysiert werden, um den Verkehr des einzelnen Prozesses zu extrahieren, an dem Sie interessiert sind.
Valerio Schiavoni