Savoir quel process fait l'E / S sans iotop

Sous Linux, je veux savoir quel process utilise ma bande passante d'E / S de disque.

Je sais que je peux utiliser iotop mais j'ai une machine où, pour diverses raisons, iotop ne peut pas être installé.

Comment puis-je get manuellement cette information? (Comment se passe- iotop -il?)

Le file dans /proc/<pid>/io représente ce dont vous avez besoin. C'est un travail de script pour get une sortie similaire à iotop . Voir la documentation du kernel Linux sur les valeurs du file /proc/<pid>/io :

rchar

Compteur d'E / S: chars read Nombre d'octets que cette tâche a fait lire depuis le stockage. C'est simplement la sum des octets que ce process a passé à read () et pread (). Il inclut des choses comme tty IO et il n'est pas affecté par l'existence ou non d'une disquette physique réelle IO a été requirejse (la lecture aurait pu être satisfaite de pagecache)

wchar

Compteur d'E / S: chars écrit Nombre d'octets que cette tâche a provoqués ou entraînera l'écriture sur le disque. Des mises en garde similaires s'appliquent ici comme avec rchar.

[…]

read_bytes

Compteur d'E / S: octets lus Tentative de comptage du nombre d'octets que ce process a réellement provoqué dans la couche de stockage. Fait au niveau de submit_bio (), donc il est précis pour les filesystems avec bloc.

write_bytes

Compteur d'E / S: octets écrits Tentative de décount du nombre d'octets envoyés par ce process à la couche de stockage. Ceci est fait au moment de la saleté de la page.

Maintenant, vous pouvez utiliser ce petit script bash :

 #!/bin/bash if [ "$(id -u)" -ne 0 ] ; then echo "Must be root" 2>&1 exit 1 fi delay=2 lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done) while :; do echo "-----" listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done) echo "$lista" | while read -r pida xa bytesa; do [ -e "/proc/$pida" ] || continue echo -en "$pida:\t" bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}') echo "$((($bytesb - $bytesa) / $delay)) b/s" done | sort -nk2 | tail sleep $delay listb=$lista done 

Il crée deux lists avec un timeout de 2 secondes ( $delay : peut être in- ou diminué) entre elles, puis compare les lists et calcule les différences. Le process 10 avec le plus d'E / S est imprimé avec leur bande passante d'E / S dans les 2 dernières secondes. Si vous voulez écrire des E / S au lieu de lire les E / S, éditez simplement la command grep dans les lists à wchar au lieu de rchar :

 lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done) listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)