Si vous êtes familier des systèmes GNU-Linux vous connaissez sans doute le programme "top", et bien “iotop” est aux accès disques ce que “top” est aux processus.
“Iotop” permet de contrôler les programmes ou processus qui provoquent des accès disques, qu'ils soient en écriture ou en lecture (on parle d' “I/O” en anglais pour “Input/Output”, ou E/S “Entrée/Sortie” en bon français). Cela peut s'avérer très utile si votre système connaît des ralentissements inexplicables, alors que l'activité du processeur ou l'utilisation de la mémoire vive semblent normales. Un système d'indexation des fichiers (“recherche” de bureau) qui matraque le disque ? Un gestionnaire de photos ou de collection musicale qui bogue et re-scane la collection en permanence ? Une base de donnée MySQL ou un groupe RAID qui partent en vrille ? “Iotop” désignera le coupable.
“Iotop” sera normalement fourni par votre distribution via le gestionnaire de paquets habituel, si ce n'est pas le cas, vous pouvez récupérer les sources ou des paquets pré-compilés sur le site officiel.
Pour donner des informations utiles “iotop” a besoin que certaines options de configuration du noyau soient activées, en particuliers :
Si vous n'avez aucune idée de ce dont il s'agit, sachez que vous pouvez facilement vous assurez de la disponibilité de ces traceurs au sein de votre noyau à l'aide de la commande “egrep” :
egrep '(CONFIG_VM_EVENT_COUNTERS|TASK_IO_ACCOUNTING|CONFIG_TASKSTATS|TASK_DELAY_ACCT)' /boot/config-$(uname -r)
Plus vous obtenez de “y” (“yes” pour “oui”) en fin de ligne et plus “iotop” sera en mesure de vous donner des informations utiles. Si vous n'avez que des “n” (“no”) ou des mentions “is not set” (n'est pas activé) “iotop” sera sans doute inutile sans une recompilation de noyau.
<note>Sur [K]Ubuntu (testée avec “Lucid”) il vous manquera la fonction CONFIG_TASK_DELAY_ACCT ce qui limitera les informations disponibles sur l'utilisation de la mémoire “swap” (mémoire virtuelle sur disque). Le noyau par défaut Debian offre lui toutes les fonctions nécessaires</note>
Le lancement se fait simplement en tapant le nom du programme, il sera facile de passer la plupart des options de manière interactive :
iotop
L'écran par défaut présente de nombreuses informations difficiles à interpréter au premier coup d'œil, d'autant plus que l'affichage est rafraîchit régulièrement. IOTOP fonctionne sans s'arrêter en rafraîchissant les données toutes les secondes. Tous les processus et sous-processus (“threads”) sont affichés, et ce pour tous les utilisateurs.
Appuyer à nouveau sur la même touche annulera l'option.
Pour détailler un peu l'option [o] vous permet de débarrasser la vue de tous les processus qui n'exécutent pas d'opérations d'entrée/sortie sur vos disques, c'est à dire probablement la majorité, pour rendre la sortie plus lisible et rapidement identifier ce qui provoque l'activité. L'option [a] permet de laisser tourner “iotop” dans une console, et lorsque vous le consulterez un peu plus tard vous pourrez lire l'activité cumulée des processus (c'est à dire la quantité d'opérations d'entrée/sortie, le volume de données concernés, l'utilisation de mémoire swap, etc…).
Pour changer le critère de classement des processus, vous pouvez utiliser les flèches droite et gauche du clavier, cela mettra en surbrillance l'une ou l'autre des colonnes et donnera au critère correspondant la priorité pour le classement. Ces colonnes sont : PID, priorité “ionice” (voir plus bas), utilisateur à qui appartiennent les (sous-)processus, lectures disques, écritures disques, utilisation de la swap, quantité d'opérations d'I/O cumulées, ou enfin nom de la commande correspondant au processus.
La touche [r] inversera l'ordre de classement pour le critère (la colonne) choisi.
La touche [i] permettra de lancer un dialogue (une simple ligne en haut de la fenêtre d'iotop) qui attend un numéro de TID (“Thead ID”), ou PID (“Process ID”) si l'option [p] d'iotop est utilisée, et permettra de changer la priorité d'ionice du thread/processus visé. L'ionice est aux opération d'E/S ce que “nice” est à l'utilisation processeur, cela permet de réduire la priorité (ou “l'agressivité”) du processus visé. On ne va pas développer ici le fonctionnement d'ionice, mais sachez que les processus sont classés en trois classes explicites, plus une par défaut (implicite) :
En pratique, vous n'utiliserez probablement que la classe 2 “Best Effort” à l'intérieur de laquelle vous jouerez sur les 8 niveaux de priorité, et occasionnellement 3 “Idle” pour réduire l'influence d'un processus trop agressif sans avoir à le tuer. Le dialogue d'iotop vous demandera le numéro du processus visé, la classe souhaitée, et enfin le niveau de priorité (0-7).
Dans certains cas, il sera pratique de rediriger la sortie d'“iotop” vers un fichier plutôt que vers la sortie standard, dans ce cas on utilisera l'option -b (pour “--batch”) suivie de toute(s) autre(s) option(s) souhaitée(s), et enfin une redirection vers un fichier texte.
Un exemple d'utilisation dans ce mode non-interactif :
iotop --batch -d 10 -n 3 > iotop.txt
Une telle utilisation ne sera pas très pratique, elle lance iotop en mode non-interactif (option “--batch”), pour trois sessions (-n 3) espacées de 10 secondes (-d 10). Étant donné que tous les processus seront enregistrés, la sortie sera longue, fastidieuse à lire et ne contiendra que des instantanés. De manière plus utile, on pourra utiliser :
iotop --batch -a -o -n 5 -d 30 --time > iotop.txt
Ici, on lance “iotop” qui fera 5 rapports (-n 5) espacés de 30 secondes (-d 30), vous reconnaissez les options “-a” pour le mode cumulatif et “-o” pour limiter la sortie aux seuls processus actifs. “--time” permet de faire précéder chaque ligne de l'heure à laquelle le rapport a été enregistré pour faciliter la lecture.
Il vous reste à éplucher la sortie, identifier le(s) processus qui monopolisent les opérations d'E/S, et enfin à remédier au problème en stoppant un processus “fou”, en optimisant ou décalant une tâche “cron” ou des accès à une base de donnée, ou encore en faisant un rapport de bogue, si le comportement détecté avec “iotop” vous paraît anormal.