Savoir quel processus fait les E / S sans iotop

12

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

Je sais que je peux l'utiliser iotopmais j'ai une machine où, pour diverses raisons, iotopne peut pas être installée.

Comment puis-je obtenir manuellement ces informations? (Comment se passe iotop- t -il?)

Totor
la source

Réponses:

15

Le fichier en /proc/<pid>/iorepré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>/iovaleurs 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 bashscript:

#!/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 grepcommande dans les listes au wcharlieu 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)
le chaos
la source