Le fichier en /proc/<pid>/io
représente ce dont vous avez besoin. C'est un peu de travail de script pour obtenir une sortie similaire à iotop
. Voir la documentation du noyau linux pour les /proc/<pid>/io
valeurs des fichiers:
rchar
Compteur d'E / S: caractères lus Nombre d'octets que cette tâche a provoqué pour la lecture du stockage. Il s'agit simplement de la somme des octets que ce processus a transmis à read () et pread (). Il inclut des choses comme tty IO et il n'est pas affecté par la nécessité ou non d'une véritable E / S sur disque physique (la lecture peut avoir été satisfaite depuis pagecache)
wchar
Compteur d'E / S: caractères écrits Le nombre d'octets que cette tâche a provoqué ou doit faire écrire sur le disque. Des mises en garde similaires s'appliquent ici comme avec rchar.
[...]
read_bytes
Compteur d'E / S: lecture d'octets Tentative de compter le nombre d'octets que ce processus a réellement fait extraire de la couche de stockage. Fait au niveau de submit_bio (), il est donc précis pour les systèmes de fichiers sauvegardés par blocs.
write_bytes
Compteur d'E / S: octets écrits Tentative de compter le nombre d'octets que ce processus a fait envoyer à la couche de stockage. Cela se fait au moment de l'encrassement des pages.
Maintenant, vous pouvez utiliser ce petit bash
script:
#!/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 listes avec un délai de 2 secondes ( $delay
: peut être intégré ou diminué) entre elles, puis compare les listes et calcule les différences. Les 10 processus avec le plus d'E / S sont imprimés avec leur bande passante d'E / S au cours des 2 dernières secondes. Si vous souhaitez écrire des E / S au lieu de lire des E / S, modifiez simplement la grep
commande dans les listes au wchar
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)