Existe-t-il un outil qui peut surveiller l'utilisation de la bande passante d'un seul processus?

15

J'ai trouvé un bon moniteur qui me permet d'enregistrer une variété de données d'exécution d'un seul processus. Je recherche un équivalent qui fait de même pour l'utilisation de la bande passante. Idéalement, la commande devrait ressembler bwmon --pid 1 --log init.log. Y en a-t-il? Peut-il s'exécuter sans privilèges d'administrateur?

tshepang
la source
1
en relation: superuser.com/questions/189128/…
akira
serverfault.com/questions/36586/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

3

quelque chose pour vous aider à démarrer (juste au cas où vous voudriez l'écrire vous-même):

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

commentaires:

  • vérifie seulement eth0
  • vérifie toutes les 1 seconde
  • ne fonctionne que sous linux, mais d'autres unix fonctionnent de manière similaire (procfs ou autre)
  • la sortie pourrait être stockée dans un sqlite.db avec stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
akira
la source
11
Je ne pense pas que ce soit en fait un compteur par processus; Je pense que c'est juste le nombre total d'interfaces du point de vue du processus. J'ai couru une ncpaire client / serveur sur localhost, en envoyant un octet par seconde, et j'ai regardé /proc/<listening-nc-pid>/net/dev. Puis j'ai couru une deuxième ncpaire, en envoyant au rythme maximum. Le fichier que je regardais comptait très évidemment les données de la deuxième paire avec celles de la première paire. Fonctionnant sous Linux 2.6.32.
Jander
J'ai eu une erreur function strftime never defined; il a été corrigé en installant gawk .
tshepang
4
@Jander C'est exact, /proc/<pid>/net/devet /proc/net/devj'ai le même contenu ici. Par conséquent, le scipt signale uniquement le trafic pour eth0, pas pour le processus donné.
scai
1
Confirmant que ce n'est pas une réponse. Il mesure le compteur d'interface pour eth0, vu par le processus. Il ne compte pas les données envoyées par le processus via cette interface.
Navin
@Navin une réponse est tout ce qui tente de répondre à la question. Une mauvaise réponse est toujours une réponse. Si celui-ci est erroné, vous pouvez voter contre, mais c'est toujours une réponse.
terdon
6

Si vous êtes satisfait de la bande passante d'E / S générale utilisée (ou si votre programme fait presque entièrement des E / S réseau), vous pouvez regarder le /proc/<pid>/iofichier. Vous voulez les champs rcharet wchar. Vous voudrez peut-être soustraire read_byteset write_bytes, car ils représentent des lectures et des écritures sur la couche de stockage. Voir la section 3.3 de http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Si vous avez besoin de plus de résolution ... vous pourriez peut-être l'écrire en utilisant lsofet strace, bien que ce soit pénible de bien régler tous les cas d'angle. L'idée de base est d'analyser la sortie strace -p <pid>, saisissant le premier paramètre (= le descripteur de fichier) et la valeur de retour (= nombre d'octets) à partir de read(), write(), send()et les recv()appels ( NOTE il y a plusieurs autres syscalls à écouter, havre de paix I » t les a tous traqués). Jeter les valeurs négatives; ils indiquent des erreurs. Utilisez lsof -p <pid>pour déterminer quels descripteurs de fichiers sont des sockets TCP / UDP et additionner les nombres par fd. Cette stratégie ne nécessite pas de root tant que vous possédez le processus que vous inspectez, mais ce serait vraiment poilu d'écrire, et encore moins d'écrire bien.

Jander
la source
3

essayez les nethogs :

NetHogs est un petit outil «net top». Au lieu de décomposer le trafic par protocole ou par sous-réseau, comme la plupart des outils, il regroupe la bande passante par processus. NetHogs ne repose pas sur un module de noyau spécial à charger. S'il y a soudainement beaucoup de trafic réseau, vous pouvez lancer NetHogs et voir immédiatement quel PID est à l'origine de cela. Cela permet d'identifier facilement les programmes qui se sont déchaînés et qui prennent soudainement votre bande passante.
akira
la source
2
Malheureusement, il ne peut pas surveiller un seul processus et ne se connecte pas. La deuxième exigence (journalisation) est cependant beaucoup plus importante que la première. Oh, et cela ne fonctionne pas sans privilèges d'administrateur :(
tshepang
1
Vous aurez presque certainement besoin de privilèges root pour cela.
Falmarri
Vous pouvez essayer d'utiliser nethogs avec l'indicateur -t (tracemode). La sortie résultante pourrait ensuite être analysée pour extraire le trafic du processus unique qui vous intéresse.
Valerio Schiavoni