Esiste uno strumento in grado di monitorare l'utilizzo della larghezza di banda di un singolo processo?


15

Ho trovato un bel monitor che mi consente di registrare una varietà di dati di runtime di un singolo processo. Sto cercando un equivalente che faccia lo stesso per l'utilizzo della larghezza di banda. Idealmente, il comando dovrebbe apparire come bwmon --pid 1 --log init.log. C'è questo? Può funzionare senza privilegi di amministratore?



Risposte:


3

qualcosa per iniziare (nel caso in cui si desideri scriverlo da soli):

#!/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

Commenti:

  • controlla solo eth0
  • controlla ogni 1 secondo
  • funziona solo con Linux, ma altri unix funzionano in modo simile (procfs o altro)
  • l'output può essere archiviato in sqlite.db con stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3

11
Non penso che questo sia in realtà un contatore per processo; Penso che sia solo il conteggio dell'interfaccia totale dal punto di vista del processo. Ho eseguito una nccoppia client / server su localhost, inviando un byte al secondo e guardato /proc/<listening-nc-pid>/net/dev. Quindi ho eseguito una seconda nccoppia, inviando alla massima velocità. Il file che stavo guardando ovviamente ha contato i dati della seconda coppia insieme a quelli della prima coppia. In esecuzione su Linux 2.6.32.
Jander,

Ho avuto un errore function strftime never defined; è stato risolto installando gawk .
Tshepang,

4
@Jander È corretto, /proc/<pid>/net/deve /proc/net/devhanno lo stesso contenuto qui. Quindi lo scipt riporta solo il traffico per eth0, non per il processo dato.
scai,

1
Confermando che questa non è una risposta. Misura il contatore dell'interfaccia per eth0, come visto dal processo. Essa non conta dati inviati dal processo attraverso l'interfaccia.
Navin,

@Navin una risposta è tutto ciò che cerca di rispondere alla domanda. Una risposta sbagliata è ancora una risposta. Se questo è sbagliato, puoi ridimensionarlo, ma è comunque una risposta.
terdon

6

Se sei soddisfatto della larghezza di banda di I / O generale utilizzata (o se il tuo programma esegue quasi interamente I / O di rete), puoi guardare il /proc/<pid>/iofile. Volete i campi rchare wchar. Potresti voler sottrarre read_bytese write_bytes, poiché rappresentano letture e scritture nel livello di archiviazione. Vedere la sezione 3.3 di http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Se hai bisogno di più risoluzione .... potresti forse scriverlo usando lsofe strace, anche se sarebbe doloroso riuscire a correggere tutti i casi angolari. L'idea di base è quella di analizzare l'output di strace -p <pid>, afferrando il primo parametro (= il descrittore di file) e il valore di ritorno (= numero di byte) da read(), write(), send()e recv()le chiamate ( NOTA ci sono diverse altre chiamate di sistema per ascoltare; rifugio I' li ho rintracciati tutti in basso). Elimina i valori negativi; indicano errori. Utilizzare lsof -p <pid>per capire quali descrittori di file sono socket TCP / UDP e sommare i conteggi per fd. Questa strategia non richiede root fintanto che possiedi il processo che stai esaminando, ma sarebbe davvero peloso scrivere, figuriamoci scrivere bene.


3

prova i nethogs :

NetHogs è un piccolo strumento "net top". Invece di suddividere il traffico per protocollo o per sottorete, come la maggior parte degli strumenti, raggruppa la larghezza di banda per processo. NetHogs non si basa su un modulo kernel speciale da caricare. Se improvvisamente c'è molto traffico di rete, puoi avviare NetHogs e vedere immediatamente quale PID sta causando questo. Ciò semplifica l'identificazione dei programmi che sono diventati selvaggi e stanno improvvisamente occupando la tua larghezza di banda.

2
Purtroppo, non è in grado di monitorare un singolo processo e non registra. Il secondo requisito (registrazione) è molto più importante del primo. Oh, e non funziona senza i privilegi di amministratore :(
tshepang

1
Avrai quasi sicuramente bisogno dei privilegi di root per questo.
Falmarri,

Puoi provare a usare nethogs con il flag -t (tracemode). L'output risultante potrebbe quindi essere analizzato per estrarre il traffico del singolo processo che ti interessa.
Valerio Schiavoni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.