web-dev-qa-db-fra.com

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

Autant que j'ai lu sur iowait, c'est toujours un mystère pour moi.

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

Quels sont également les bons outils pour diagnostiquer quel (s) processus ont attendu exactement les E/S?.

Et quelles sont les façons de minimiser le temps d'attente IO?

207
Peter Krumins

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

Oui, le système d'exploitation planifie l'exécution d'autres processus pendant que l'un est bloqué sur IO. Cependant, à l'intérieur de ce processus, à moins qu'il n'utilise des E/S asynchrones, il ne progressera pas tant que l'opération IO n'est pas terminée).

Quels sont également les bons outils pour diagnostiquer quel (s) processus ont attendu exactement les E/S.

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 IO requêtes par processus
  • strace, pour regarder les opérations réelles émises par un processus

Et quelles sont les façons de minimiser le temps d'attente IO?

  • assurez-vous que la mémoire physique est libre afin que le système d'exploitation puisse mettre en cache les blocs de disque en mémoire
  • maintenez l'utilisation du disque de votre système de fichiers en dessous de 80% pour éviter une fragmentation excessive
  • régler votre système de fichiers
  • utiliser un contrôleur de baie alimenté par batterie
  • choisir de bonnes tailles de tampon lors de l'exécution d'opérations io
103
Dave Cheney

Vieille question, récemment heurtée, mais jugeant les réponses existantes insuffisantes.

Définition et propriétés de l'IOWait

IOWait (généralement appelé %wa en haut) est une sous-catégorie d'inactivité (%idle est généralement exprimé comme inactif sauf les sous-catégories définies), ce qui signifie que le CPU ne fait rien. Par conséquent, tant qu'il y aura un autre processus que le processeur pourrait traiter, il le fera. De plus, inactif, utilisateur, système, iowait, etc. sont une mesure par rapport au CPU. En d'autres termes, vous pouvez considérer iowait comme le ralenti causé par l'attente de io.

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

Importance et idées fausses potentielles

IOWait est important car il s'agit souvent d'une mesure clé pour savoir si vous êtes goulot d'étranglement sur les E/S. Mais l'absence de iowait ne signifie pas nécessairement que votre application est pas goulot d'étranglement sur IO. Considérez 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 gros utilisateur du processeur, le %user + %system du CPU peut toujours être quelque chose comme ~ 100% et en conséquence, iowait afficherait 0. Mais c'est juste parce que le programme 2 est intensif et semble ne rien dire du programme 1 parce que tout cela est du point de vue du CPU.

Outils pour détecter IOWait

Voir les articles de Dave Cheney et Xerxes

Mais aussi un simple top s'affichera dans %wa.

Réduire l'IOWait

De plus, comme nous entrons maintenant dans 2013, en plus de ce que d'autres ont dit, l'option de simplement génial IO périphériques de stockage sont abordables, à savoir les SSD. Les SSD sont géniaux !!!

48
Grumpy

iowait

iowait est le temps que le processeur/les processeurs attendent (c'est-à-dire est dans un état inactif et le fait rien ), pendant lequel il y avait en fait demandes d'E/S disque en attente.

Cela signifie généralement que les périphériques de bloc (c'est-à-dire les disques physiques, pas la mémoire) sont trop lents ou simplement saturés.

Vous devez donc noter que si vous voyez une moyenne de charge élevée sur votre système, et sur avis d'inspection que la plupart de cela est dû à une attente d'E/S, cela ne signifie pas nécessairement que votre système est en difficulté - 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 ressortir du fait que tout ce que vous faites sur le système est toujours très réactif.

outils

  • sar (du package sysstat, disponible sur la plupart des machines * nix)
  • iostat
  • sarface (un frontal pour sar)
36
Xerxes

J'ai trouvé les explications et les exemples de ce lien très utiles: Qu'est-ce que "iowait"? . BTW, par souci d'exhaustivité, les E/S se réfèrent ici aux E/S disque, mais pourraient également inclure des E/S sur un disque monté sur réseau (tel que nfs), comme expliqué dans cet autre article =.

Je vais citer quelques sections importantes (au cas où le lien disparaîtrait), certaines d'entre elles seraient des répétitions de ce que d'autres ont déjà dit, mais pour moi au moins, elles étaient plus claires:

Pour le résumer en une phrase, "iowait" est le pourcentage de temps pendant lequel le CPU est inactif ET il y a au moins une E/S en cours.

Chaque CPU peut être dans l'un des quatre états: utilisateur, sys, inactif, iowait.

Je me demandais ce qui se passe lorsque le système a d'autres processus prêts à fonctionner alors qu'un processus attend des E/S. Ce qui suit l'explique:

Si le CPU est inactif, le noyau détermine alors s'il y a au moins une E/S en cours vers un disque local ou un disque monté à distance (NFS) qui a été lancé à partir de ce CPU. S'il y en a, le compteur "iowait" est incrémenté de un. S'il n'y a aucune E/S en cours qui 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 exécutés sur un CPU. 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 à des travaux de calcul. Supposons maintenant qu'il y a un problème avec le sous-système d'E/S et que les E/S physiques prennent plus d'une seconde pour se terminer. Chaque fois que le programme "dd" dort en attendant la fin de ses E/S, l'autre programme peut s'exécuter sur cette CPU. 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% idle et% iowait seront 0. Même si iowait est maintenant 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 plus d'une seconde pour se terminer.

Le texte intégral mérite d'être lu. Voici un miroir de cette page , au cas où ça baisserait.

34
haridsv

Pour Solaris, j'utilise DTrace pour voir ce que font les processus si j'ai besoin de voir 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 d'exposition similaire au noyau et aux appels de processus.

Un exemple que j'ai utilisé lors de l'apprentissage de DTrace était de comparer une commande cp à une commande dd. Vous pouvez voir que dd fait beaucoup plus de lectures pour l'écriture, tandis que cp ne le fait pas, principalement en raison de la taille du tampon que dd utilise par défaut (si je me souviens bien correctement).

1
Milner

Le 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épendra des applications en cours d'exécution quant à ce qu'elle peut faire. Si vous avez une seule application threadée qui fait beaucoup d'accès au disque, vous devrez attendre.

Pour minimiser le temps IO, achetez plus de mémoire et plus rapidement, obtenez des disques plus rapides, défragmentez les disques dont vous disposez.

S'il s'agit d'une application interne qui est le goulot d'étranglement, voyez si elle peut être optimisée pour lire dans des blocs plus gros ou pour faire IO de manière asynchrone.

0
Jeremy French

utilisation de ps aux can print process STAT
si stat est D ou Ds, le processus est en sommeil sans interruption (généralement IO)
lorsqu'un processus entre en sommeil sans interruption, nr_iowait de runqueue est ajouté, et si nr_iowait> 0, le temps d'inactivité de cpu est compté pour iowait

vmstat montre également combien de blocs de processus
r: nombre de processus en attente d'exécution.
b: Le nombre de processus dans le sommeil sans interruption.

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

0
Singo