Aller au contenu

iostat

Présentation de l’outil

iostat est un utilitaire de surveillance des performances d’E/S disque pour les systèmes Unix et Linux. Il fait partie du paquet sysstat et permet de collecter et de rapporter des statistiques sur les opérations d’entrée/sortie des périphériques de stockage. Cet outil est particulièrement utile pour les administrateurs système pour diagnostiquer les problèmes de performance liés au disque.

Installation

Sur Debian/Ubuntu

  1. Mettez à jour la liste des paquets :

    sudo apt update
    
  2. Installez le paquet sysstat qui inclut iostat :

    sudo apt install sysstat
    

Sur CentOS

  1. Mettez à jour la liste des paquets :

    sudo yum update
    
  2. Installez le paquet sysstat qui inclut iostat :

    sudo yum install sysstat
    

Exemples d’utilisation

Utilisation

Après l’installation, vous pouvez exécuter iostat en utilisant diverses options pour surveiller les performances de votre disque. Voici quelques exemples :

  • Pour afficher un rapport simple :

    iostat
    
  • Pour afficher un rapport toutes les 2 secondes :

    iostat 2
    
  • Pour afficher un rapport étendu sur le CPU et les dispositifs :

    iostat -c -d -x
    

Dans ces exemples :

  • -c permet de n’afficher que les informations CPU ;
  • -d permet de n’afficher que les informations disque ;
  • -x affiche des statistiques étendues. Ce mode est le plus intéressant ;
  • 2 est le nombre en fin de commande qui est l’intervalle de rafraichissement en secondes. Il est possible de spécifier un second nombre après ce premier, qui sera le nombre de mesures à effectuer.

Attention

La première mesure retournée est une moyenne depuis le démarrage du système. Il ne faut pas la prendre en compte.

Premier exemple d’interprétation

Exemple d’affichage de la commande en temps étendu :

> iostat -d -x 1
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0,00     2,67    1,33    4,67     5,33    29,33    11,56     0,02    4,00   4,00   2,40

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               1,33     5,00    1,33    5,33    16,00    41,33    17,20     0,04    5,20   2,40   1,60

Les colonnes ont les significations suivantes :

  • Device : le périphérique ;
  • rrqm/s/wrms : read request merged per second et write request merged per second, c’est-à-dire fusions d’entrées/sorties en lecture et en écriture. Cela se produit dans la file d’attente des entrées/sorties, quand des opérations sur des blocs consécutifs sont demandées… par exemple un programme qui demande l’écriture de 1Mo de données, par bloc de 4k. Le système fusionnera ces demandes d’écritures en opérations plus grosses pour le disque, afin d’être plus efficace. Un chiffre faible dans ces colonnes (comparativement à r/s et w/s) indique que le système ne peut fusionner les IOs, ce qui est signe de beaucoup d’IO non contigües (aléatoires). La récupération de données depuis un scan d’index par exemple… ;
  • r/s et w/s : nombre de lectures et d’écritures par seconde. Il ne s’agit pas d’une taille en blocs, mais bien d’un nombre d’IO par seconde. C’est ce qui est le plus proche d’une limite physique, sur un disque (plus que son débit en fait) : le nombre d’IO par seconde faisable est directement lié à la vitesse de rotation et la performance des actuateurs des bras. Il est plus facile d’effectuer des IOs sur des cylindres proches que sur des cylindres éloignés, donc même cette valeur n’est pas parfaitement fiable. La somme de r/s et w/s devrait être assez proche des capacités du disque. De l’ordre de 150 IO par seconde pour un disque 7200 RPMS (SATA), 200 pour un 10000 RPMS, 300 pour un 15000 RPMS ;
  • rkB/s et wkB/s : les débits en lecture et écriture. Ils peuvent être faibles, avec un disque pourtant à 100% ;
  • avgrq-sz : taille moyenne d’une requête. Plus elle est proche de 1, plus les opérations sont aléatoires. Sur un SGBD c’est mauvais : dans l’idéal soit les opérations sont séquentielles, soit elles se font en cache.
  • avgqu-sz : taille moyenne de la file d’attente des IOs. Si ce chiffre est élevé, cela signifie que les IOs s’accumulent. Ce n’est pas forcément anormal, mais cela entrainera des latences, surtout avec des schedulers comme deadline. Si on est en train d’effectuer une grosse écriture, ce n’est pas choquant (cf second exemple).
  • await : temps moyen attendu par une IO avant d’être totalement traitée. C’est le temps moyen écoulé, vu d’un programme, entre la soumission d’une l’IO et la récupération des données. C’est un bon indicateur du ressenti des utilisateurs : c’est le temps moyen qu’ils ressentiront pour qu’une IO se fasse (donc vraisemblablement une lecture, vu que les écritures sont asynchrones, vues par un utilisateur de PostgreSQL).
  • svctm : temps moyen du traitement d’une IO par le disque. Contrairement à await, on ne prend pas en compte le temps passé en file d’attente. C’est donc un indicateur de l’efficacité de traitement des IOs par le disque (il sera d’autant plus efficace qu’elles seront proches sur le disque).
  • %util : le pourcentage d’utilisation. Il est calculé comme : (r/s + w/s) * (svctm / 1000) * 100 C’est-à-dire nombre d’IOs par seconde, multiplié par le temps de traitement d’une IO en seconde, et multiplié par 100.

Attention

À cause des erreurs d’arrondis, il est approximatif, et dépasse quelquefois 100.

Deuxième exemple d’interprétation

Exemple d’affichage de la commande lors d’une copie de 700 Mo :

> iostat -d -x 1
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              60,67  1341,33  156,67   24,00 17534,67  2100,00   217,36    34,43  124,52   5,53  99,87

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              20,67  3095,33   38,67  117,33  4357,33 12590,67   217,28   126,79  762,36   6,41 100,00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              30,67   803,33   63,33   73,33  8028,00  6082,67   206,50   104,94  624,05   7,32 100,00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              55,33  4203,00  106,00   29,67 12857,33  6477,33   285,03    59,08  503,95   7,37 100,00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              28,33  2692,33   56,00   32,67  7046,67 14286,67   481,20    54,58  761,74  11,28 100,00

L’attente est particulièrement longue par rapport au temps réel de lecture/écriture, preuve d’un travail très important sur les entrées/sorties.

  • rrqm : grâce à la lecture anticipative sur le fichier source, le système arrive à regrouper des IOs.
  • wrqm : le programme de copie écrit tous les blocs au fur et à mesure dans le fichier destination. Le merge est donc assez facile, avec un chiffre très élevé ici.
  • Il y a beaucoup moins de lectures que d’écritures, mais de taille plus importante.
  • Que la file d’attente est assez grosse, ce qui est logique aussi : il est très facile pour une recopie de fichiers de deviner les lectures à venir, et de bufferiser les écritures pour les effectuer en gros lots.
  • Le await est de 500ms, ce qui commence à être très élevé (il s’agit d’un disque SATA de PC de bureau, il ne peut pas effectuer beaucoup d’IO par seconde). Il est possible de réduire cette latence avec du tuning sur l’ordonnanceur (dans /sys/block/) ou radicalement changer d’algorithme d’ordonnancement. Il faut néanmoins toujours faire un compromis entre débit pur et latence.

Bibliographie

  1. Site web officiel de sysstat (qui inclut iostat) : Lien vers le site

Pour une utilisation plus avancée et des options supplémentaires, consultez la documentation et les ressources en ligne.