Quelqu'un peut-il expliquer précisément ce que IOWait est?

194

Même si j'ai lu sur iowait, c'est toujours un mystère pour moi.

Je sais que c'est le temps passé par le processeur à attendre la fin d'une opération d'E / S, mais quel type d'opérations d'E / S précisément? Ce que je ne suis pas sûr non plus, c'est pourquoi c'est si important? La CPU ne peut-elle pas faire autre chose pendant la fin de l'opération d'E / S, puis revenir au traitement des données?

De plus, quels sont les bons outils pour diagnostiquer quels processus ont attendu exactement IO.

Et quels sont les moyens de minimiser le temps d'attente des entrées-sorties?

Peter Krumins
la source
Et aussi, qu'est-ce que iowait high?
Muhamed Huseinbašić

Réponses:

99

Je sais que c'est le temps passé par le processeur à attendre la fin d'une opération d'E / S, mais quel type d'opérations d'E / S précisément? Ce que je ne suis pas sûr non plus, c'est pourquoi c'est si important? Le processeur ne peut-il pas faire autre chose pendant que l'opération d'E / S se termine, puis revenir au traitement des données?

Oui, le système d'exploitation planifie l'exécution d'autres processus alors que l'un d'entre eux est bloqué sur IO. Toutefois, à l'intérieur de ce processus, sauf si vous utilisez une E / S asynchrone, l'opération ne se poursuit qu'une fois l'opération IO terminée.

De plus, quels sont les bons outils pour diagnostiquer quels processus ont attendu exactement IO.

Quelques outils que vous pourriez trouver utiles

  • iostat, pour surveiller les temps de service de vos disques
  • iotop (si votre noyau le supporte), pour surveiller la répartition des demandes d'E / S par processus
  • strace, examiner les opérations réelles générées par un processus

Et quels sont les moyens de minimiser le temps d'attente des entrées-sorties?

  • assurez-vous d'avoir de la mémoire physique libre pour que le système d'exploitation puisse mettre en cache des blocs de disque en mémoire
  • conservez l'utilisation du disque de votre système de fichiers à moins de 80% pour éviter une fragmentation excessive
  • optimisez votre système de fichiers
  • utiliser un contrôleur RAID alimenté par batterie
  • choisissez de bonnes tailles de mémoire tampon lors de l'exécution d'opérations io
Dave Cheney
la source
6
N'oubliez pas "assurez-vous que votre stockage d'arrière-plan est suffisamment rapide pour suivre votre charge d'E / S".
Jgoldschrafe
1
@ Dave Cheney, Et lorsque mon processus est inactif, c'est parce qu'il attend IO. Alors, quelle est la différence entre IOWait et inactif?
ctrl-alt-delor
4
Lorsque vous vous trouvez dans IOwait, le processus est en "sommeil ininterruptible", ce qui signifie qu'il ne peut pas être supprimé pour éviter les risques de corruption des données sur les disques. un processus normal d'inactivité ne fait vraiment rien, il y a donc moins de risques de le tuer.
mveroone
1
En plus, cela signifie que votre IO est trop lent. "Rendre le serveur plus rapide" est différent si vous avez un nombre limité de processeurs ou si votre processeur est affamé, car quelqu'un a décidé que le disque d'un ordinateur portable trop lent suffisait pour faire fonctionner un serveur de base de données et que le chargement d'E / S faisait en sorte que le processeur n'utilise que 2% de ce qu'il peut. fou pour l'IO pour finir.
TomTom
OMG Je ne peux pas croire que les 3 premières réponses ici sont si mauvaises . La réponse ci-dessous par haridsv est correcte. Aucun processeur n'attend la fin de la io. Oui, certains io peuvent être bloquants - il y a souvent une bonne raison pour cela, et dans certaines circonstances, tous les io peuvent être bloquants. Mais vous pouvez également voir se produire des opérations complètement asynchrones.
symcbean
47

Ancienne question, récemment dépassée, mais estimant que les réponses existantes étaient insuffisantes.

IOWait définition et propriétés

IOWait (généralement indiqué %waen haut) est une sous-catégorie d'inactivité ( %idleest généralement exprimée en tant que inactif sauf les sous-catégories définies), ce qui signifie que la CPU ne fait rien. Par conséquent, tant que le processeur peut traiter un autre processus, il le fera. En outre, inactif, utilisateur, système, iowait, etc. constituent une mesure par rapport à la CPU. En d’autres termes, vous pouvez considérer iowait comme le temps mort dû à l’attente de io.

Justement, iowait est le temps passé à recevoir et à gérer les interruptions matérielles en tant que pourcentage des tics du processeur. Les interruptions logicielles sont généralement étiquetées séparément comme %si.

Importance et idée fausse potentielle

IOWait est important car c’est souvent un paramètre clé pour savoir si vous êtes goulot d’étranglement sur IO. Mais l'absence de iowait ne signifie pas nécessairement que votre application n'est pas goulot d'étranglement sur IO. Considérons deux applications s'exécutant sur un système. Si le programme 1 est fortement goulot d’étranglement et que le programme 2 est un utilisateur %user + %systemintensif du processeur , le nombre de processeurs peut toujours être de l’ordre de ~ 100% et, par conséquent, iowait indiquerait 0. Mais c’est simplement parce que le programme 2 est intensif et ne semble apparemment pas ignorer programme 1 parce que tout cela est du point de vue de la CPU.

Outils pour détecter IOWait

Voir les articles de Dave Cheney et Xerxes

Mais aussi simple topmontrera dans %wa.

Réduire IOWait

De plus, comme nous sommes presque en 2013, en plus de ce que d'autres ont dit, les périphériques de stockage IO tout simplement géniaux sont abordables, à savoir les disques SSD. Les SSD sont géniaux !!!

Grincheux
la source
35

iowait

iowaitest temps que le processeur / processeurs sont en attente (c. -à- est dans un état de repos et ne rien ), au cours de laquelle il en fait était de disque en attente des demandes d' E / S.

Cela signifie généralement que les périphériques en mode bloc (disques physiques, pas mémoire) sont trop lents ou simplement saturés.

Vous devez donc noter que si vous constatez une charge moyenne élevée sur votre système et que, lors de l’inspection, c’est en grande partie à cause d’une attente E / S, cela ne signifie pas nécessairement que votre système est en panne - et cela se produit lorsque votre la machine n'a tout simplement rien à faire, à part les processus liés aux E / S (c'est-à-dire les processus qui font plus d'E / S qu'autre chose (appels système non liés aux E / S)). Cela devrait également être évident du fait que tout ce que vous faites sur le système reste très réactif.

outils

  • sar(à partir du sysstatpackage, disponible sur la plupart des machines * nix)
  • iostat
  • sarface(un frontal à sar)
Xerxes
la source
7
Notez que, à proprement parler, cette définition du temps d'attente d'E / S n'est valable que sur des systèmes à processeur unique. Il doit être quelque peu affiné pour les systèmes multiprocesseurs
Andreas Veithen
Dans quelle mesure iowaitaffecte Load Average? Disons, 100 threads en attente de réseau, LA sera-t-il 100?
Ivan Balashov
32

J'ai trouvé l'explication et les exemples de ce lien très utiles: Qu'est-ce que "iowait"? . En passant, par souci d'exhaustivité, l'E / S fait ici référence aux E / S de disque, mais peut également inclure des E / S sur un disque monté en réseau (tel que nfs), comme expliqué dans cet autre article .

Je citerai quelques passages importants (au cas où le lien disparaîtrait), dont certains seraient des répétitions de ce que d’autres ont déjà dit, mais pour moi au moins, ils étaient plus clairs:

Pour résumer en une phrase, 'iowait' est le pourcentage de temps pendant lequel la CPU est inactive ET au moins une E / S en cours.

Chaque processeur peut être dans l’un des quatre états suivants: utilisateur, système, inactif, iowait.

Je me demandais ce qui se passait lorsque le système disposait d'autres processus prêts à s'exécuter alors qu'un processus attendait des E / S. Le ci-dessous l'explique:

Si la CPU est inactive, le noyau détermine ensuite si au moins une E / S est en cours sur un disque local ou sur un disque monté à distance (NFS) qui a été lancé à partir de cette CPU. Si tel est le cas, le compteur 'iowait' est incrémenté de un. Si aucune entrée / sortie en cours n'a été lancée à partir de cette CPU, le compteur "inactif" est incrémenté de un.

Et voici un exemple:

Disons qu'il y a deux programmes en cours d'exécution sur un processeur. L'un est un programme 'dd' qui lit le disque. L’autre est un programme qui ne fait pas d’E / S mais qui consacre 100% de son temps au calcul. Supposons maintenant qu'il existe un problème avec le sous-système d'E / S et que les E / S physiques prennent une seconde à terminer. Chaque fois que le programme 'dd' est endormi en attendant la fin de ses E / S, l'autre programme peut s'exécuter sur ce processeur. Lorsque l'interruption d'horloge se produit, un programme s'exécutera toujours en mode utilisateur ou en mode système. Par conséquent, les valeurs% inactif et% iowait seront égales à 0. Même si iowait est égal à 0, cela ne signifie pas qu'il n'y a PAS de problème d'E / S car il y en a évidemment un si les E / S physiques prennent une seconde à terminer.

Le texte intégral mérite d'être lu. Voici un miroir de cette page , au cas où il tombe en panne.

haridsv
la source
1

Pour Solaris, j'utilise DTrace pour voir ce que font les processus si j'ai besoin de savoir quelles opérations d'E / S sont en cours d'exécution. Pour Linux, il existe un programme similaire appelé systemtap qui fournit un niveau similaire d'exposition au noyau et aux appels de processus.

Un exemple que j'ai utilisé lors de l'apprentissage de DTrace consistait à comparer une cpcommande à une ddcommande. Vous pouvez voir que cela ddfait beaucoup plus de lectures pour l'écriture, ce qui cpn'est pas le cas, principalement à cause de la taille de la mémoire tampon ddutilisée par défaut (si je me souviens bien).

Milner
la source
0

Quel type d'opérations IO dépendra de vos applications et de votre configuration.

C'est important car dans certains cas, le processeur ne peut pas obtenir les données ou les instructions dont il a besoin pour continuer. Dans certains cas, cela peut continuer, mais cela dépend des applications en cours d'exécution. Si vous avez une application à un seul thread offrant beaucoup d'accès au disque, vous devrez attendre.

Pour minimiser le temps d'E / S, achetez plus de mémoire et plus rapide, obtenez des disques plus rapides, défragmentez les disques que vous avez.

S'il s'agit d'une application interne qui constitue le goulot d'étranglement, voyez si elle peut être optimisée pour lire en blocs plus importants ou pour effectuer des opérations d'E / S de manière asynchrone.

Jeremy French
la source
D'accord, alors est-ce que le temps passé dans une opération bloquante d' IO?
Peter Krumins
Ainsi, par exemple, si je fais un select () ou un poll () et qu'il se bloque, le temps d'attente avant qu'un descripteur soit disponible constituera du temps présent?
Peter Krumins
Je pense que cela devrait appartenir à SO car cela ressemble à une question de programmation.
Jeremy French
Peteris - oui, c'est une bonne façon de penser.
user2278
0

utiliser ps aux peut imprimer le processus STAT
si stat est D ou Ds, le processus est en veille ininterrompue (généralement IO)
lorsqu'un processus entre en veille ininterruptible, nr_iowait of runqueue est ajouté et si nr_iowait> 0, le temps d'inactivité de cpu est compté à iowait

vmstat indique également le nombre de blocs de processus
r: nombre de processus en attente d'exécution.
b: nombre de processus en sommeil ininterruptible.

http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

Singo
la source