iostat est un outil utile pour diagnostiquer les problèmes de performance des E/S de stockage. Dans la plupart des distributions Linux courantes, iostat est distribué dans le cadre du paquetage d’utilitaires sysstat.
Dans cet article, nous verrons comment lire les résultats d’iostat afin d’approfondir rapidement la recherche de goulots d’étranglement au niveau des performances du système.
Nous allons utiliser les arguments x et d en exécutant la commande sur une période de 30 secondes alors que le système est censé être en charge :
iostat -xd 1 30
-x affiche des informations détaillées sur les files d’attente, les temps d’attente et les temps de service, qui sont essentielles au dépannage.
-d omet les statistiques d’utilisation du CPU afin que nous puissions nous concentrer uniquement sur les mesures d’entrées/sorties de stockage.
1 signifie que la commande imprimera les métriques toutes les secondes (intervalle)
30 signifie que la commande sera répétée 30 fois, ce qui nous donne des informations sur une demi-minute.
Ces valeurs peuvent être ajustées pour fonctionner plus longtemps ou à l’infini avec un intervalle plus grand, de sorte que vous pouvez obtenir des données sur une longue période de temps - jusqu’à ce que l’utilisateur interrompe la commande.
| Value | Description |
|---|---|
| rrqm | read requests queued merged |
| wrqm | write requests queued merged |
| r | reads per second |
| w | writes per second |
| rkB | reads in KB per second |
| wkB | writes in KB per second |
| avgrq-sz | average request queue size |
| avgqu-sz | average queue size |
| await | average total time for a request to be served |
| r_await | average time for read request to be served |
| w_await | average time for write request to be served |
| svctm | actual service time after a request is picked up |
| util | projected device saturation |
Les statistiques peuvent être rapportées pour plusieurs lecteurs. Trouvez le périphérique qui dessert les chemins d’accès au système de fichiers “occupés”. Pour connaître les statistiques d’utilisation du disque/de la partition, nous pouvons utiliser l’option -p. Cette option peut être utilisée pour vérifier spécifiquement l’utilisation du disque/de la partition où les données d’Elasticsearch sont lues et écrites. Un exemple de sortie ressemblerait à ceci :
# iostat -xdp sda 5 2
Linux 4.18.0-425.19.2.el8_7.x86_64 (some-hostname-here) 06/05/2023 _x86_64_ (8 CPU)
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.02 0.77 0.39 14.60 0.00 0.18 0.36 19.27 0.77 2.56 0.00 23.04 18.88 0.59 0.05
sda1 0.00 0.00 0.01 0.00 0.00 0.00 0.00 0.00 0.43 3.86 0.00 29.59 0.56 0.80 0.00
sda2 0.02 0.76 0.38 14.60 0.00 0.18 0.37 19.45 0.78 2.59 0.00 22.98 19.10 0.59 0.05
Il est courant de se concentrer sur la valeur %util pour faire des hypothèses sur la charge d’E/S, mais cela ne révèle généralement pas toute la vérité.
L’utilisation peut être signalée comme élevée alors que le système n’est pas soumis à une charge maximale. Dans ce cas, il se peut que le système d’exploitation ne reçoive pas suffisamment de demandes pour les regrouper efficacement, et qu’il soumette donc un plus grand nombre de petits lots de lecture/écriture, ce qui conduit à une utilisation présumée élevée de la mémoire tampon. Cette valeur représente le pourcentage de temps pendant lequel l’appareil a été occupé à répondre à une demande - mais les appareils modernes peuvent exécuter plusieurs demandes en parallèle.
Des valeurs élevées de avgrq-sz indiquent que le système d’exploitation met en lot les demandes d’écriture afin d’obtenir des performances d’E/S optimales. Des valeurs élevées d’avgrq-sz indiquent que le système d’exploitation s’efforce davantage d’optimiser les lots de requêtes en raison d’une charge d’E/S accrue. Encore une fois, cela ne signifie pas que le tampon d’E/S a atteint sa limite de quelque manière que ce soit.
C’est lorsque avgqu-sz commence à s’accumuler que les choses deviennent réelles. Cette valeur fait référence au nombre d’opérations qui ont été mises en file d’attente et qui attendent d’être servies. Cette valeur est généralement étroitement liée au temps d’attente (qui peut être décomposé en temps d’attente en écriture et en lecture) et au svctm. Au fur et à mesure que le temps de service augmente, ce qui signifie que chaque opération prend plus de temps, le temps moyen d’attente d’une requête augmente et, par conséquent, davantage de requêtes sont mises en file d’attente.
C’est à ce moment-là que les E/S de stockage commencent réellement à causer une pression négative sur les applications en raison du goulot d’étranglement.
ne vous concentrez pas uniquement sur le pourcentage d’utilisation la métrique à surveiller est l’avgqu-sz, qui devrait normalement être proche de 0. Normalement, il devrait être proche de 0. Lorsque des salves de lecture/écriture sont reçues, il peut grimper plus haut, jusqu’à quelques centaines. Si ce chiffre baisse au cours des quelques secondes suivantes, il peut s’agir d’une congestion occasionnelle. S’il reste constamment élevé, c’est le moment où votre application commencera probablement à rejeter des lectures ou des écritures.
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdb 0.00 1631.68 0.00 397.03 0.00 8003.96 40.32 4.65 11.55 0.00 11.55 2.33 92.48
Exemple d’utilisation élevée avec une congestion réelle :
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdb 0.00 808.00 0.00 551.00 0.00 30600.00 111.07 99.77 56.73 0.00 56.73 15.81 99.60
iostat indique une utilisation de la mémoire tampon de plus de 99 %, le système d’exploitation a augmenté la taille moyenne des lots de requêtes à 111 opérations, mais les temps d’attente et les temps svctm semblent également élevés. Le débit atteint est de 30 Mo/s. S’il s’agit d’une explosion instantanée, elle peut être gérée sans problème, mais si cette file d’attente persiste ou s’accumule au fil du temps, cela signifie que nous avons affaire à un goulot d’étranglement d’E/S.
Lorsque nous examinons les données, nous voulons cibler un disque spécifique.
#!/bin/bash
export infile=iostat.txt
export devicename=disk1
export outfile=disk1txt
head -10 ${infile} | grep Device | awk '{print $1" "$10" "$11" "$12" "$15" "$16}' | awk '{printf("%-15s\t%10s\t%10s\t%10s\t%10s\t%10s\n",$1,$2,$3,$4,$5,$6)}' > ${outfile}
cat ${infile} | grep ${devicename} | awk '{print $1" "$10" "$11" "$12" "$15" "$16}' | awk '{printf("%-15s\t%10.2f\t%10.2f\t%10.2f\t%10.2f\t%10.2f\n",$1,$2,$3,$4,$5,$6)}' >> ${outfile}
cat ${outfile}
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util