Comment un processeur sait-il que des E / S sont en attente?

17

J'ai examiné la iowaitpropriété indiquée dans la sortie de l'utilitaire supérieur, comme indiqué ci-dessous.

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait est généralement défini comme suit:

"C'est le temps pendant lequel le CPU est inactif et il y a des E / S en attente."

Je crois comprendre qu'un processus est exécuté sur un seul processeur. Une fois qu'il a été retiré de la planification, soit parce qu'il a épuisé son créneau horaire, soit après avoir été bloqué, il peut éventuellement être à nouveau planifié sur n'importe quel processeur.

En cas de demande d'E / S, un processeur qui met un processus en veille sans interruption est responsable du suivi de l' iowaitheure. Les autres processeurs signalent en même temps que le temps d'inactivité de leur côté car ils sont vraiment inactifs. Cette hypothèse est-elle correcte?

En outre, en supposant qu'il existe une longue demande d'E / S (ce qui signifie que le processus a eu plusieurs opportunités d'être planifié mais n'a pas été planifié parce que l'E / S n'était pas terminée), comment un processeur sait-il qu'il existe des "E / S en attente"? D'où vient ce genre d'information? Comment un processeur peut-il simplement découvrir qu'un processus a été mis en veille pendant un certain temps pour qu'une E / S se termine, car n'importe quel processeur aurait pu mettre ce processus en veille. Comment ce statut de "IO en attente" est-il confirmé?

Alchimiste
la source
3
Msgstr "Un processus est exécuté sur une seule CPU". Pas vraiment. Un thread est exécuté sur un seul cœur de CPU, mais les processus modernes ont plusieurs threads et les CPU modernes ont plusieurs cœurs.
MSalters
@MSalters Et même dans ce cas, alors qu'un seul thread ne peut s'exécuter que sur un cœur à un moment donné, le cœur sur lequel il s'exécute peut changer après un changement de contexte.
JAB
1
Il y a ce qu'on appelle une requête d'interruption (IRQ) mais c'est peut-être plus de matériel que ce qui nous intéresse.
mathreadler

Réponses:

33

Le CPU ne sait rien de tout cela, le planificateur de tâches le sait.

La définition que vous citez est quelque peu trompeuse; la procfs(5)page de manuel actuelle a une définition plus précise, avec des mises en garde:

iowait (depuis Linux 2.5.41)

(5) Temps d'attente pour terminer les E / S. Cette valeur n'est pas fiable, pour les raisons suivantes:

  1. Le CPU n'attendra pas la fin des E / S; iowaitest le temps pendant lequel une tâche attend la fin des E / S. Lorsqu'un processeur passe à l'état inactif pour les E / S de tâche en attente, une autre tâche est planifiée sur ce processeur.

  2. Sur un processeur multicœur, la tâche en attente de fin d'E / S ne s'exécute sur aucun processeur, de sorte que le iowaitcalcul de chaque processeur est difficile à calculer.

  3. La valeur de ce champ peut diminuer dans certaines conditions.

iowaittente de mesurer le temps passé à attendre les E / S, en général. Il n'est pas suivi par un processeur spécifique, ni ne peut l'être (point 2 ci-dessus - qui correspond également à ce que vous vous demandez). Il est cependant mesuré par CPU, dans la mesure du possible.

Le planificateur de tâches «sait» qu'il y a des E / S en attente, car il sait qu'il a suspendu une tâche donnée car il attend des E / S. Ceci est suivi par tâche dans le in_iowaitdomaine du task_struct; vous pouvez rechercher in_iowaitdans le noyau du planificateur pour voir comment il est défini, suivi et effacé. Le récent article de Brendan Gregg sur les moyennes de charge Linux comprend des informations générales utiles. L' iowaitentrée dans /proc/stat, qui est ce qui finit par top, est incrémentée chaque fois qu'un tick de minuterie est pris en compte, et le processus en cours «sur» le CPU est inactif; vous pouvez le voir en recherchant account_idle_timedans le code de suivi du temps CPU du planificateur .

Une définition plus précise serait donc «le temps passé sur ce CPU à attendre les E / S, alors qu'il n'y avait rien de mieux à faire» ...

Stephen Kitt
la source