Skąd procesor wie, że oczekuje na IO?


17

Patrzyłem na iowaitwłaściwość pokazaną na górnym wyjściu narzędzia, jak pokazano poniżej.

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 jest ogólnie definiowany w następujący sposób:

„Jest to czas bezczynności procesora i oczekiwanie na niektóre operacje we / wy”.

Rozumiem, że proces jest uruchamiany na jednym procesorze. Po de-harmonogramowaniu, ponieważ wykorzystał swój przedział czasowy lub po tym, jak został zablokowany, może ostatecznie zostać ponownie zaplanowany na dowolnym CPU.

W przypadku żądania We / Wy procesor, który wprowadza proces w nieprzerwany sen, jest odpowiedzialny za śledzenie iowaitczasu. Pozostałe procesory zgłaszałyby na tym samym czasie bezczynności, ponieważ tak naprawdę są bezczynne. Czy to założenie jest prawidłowe?

Ponadto, zakładając, że istnieje długie żądanie We / Wy (co oznacza, że ​​proces miał kilka możliwości zaplanowania, ale nie został zaplanowany, ponieważ We / Wy nie zostało ukończone), skąd procesor wie, że istnieje "oczekujące We / Wy"? Skąd pochodzą takie informacje? Jak procesor może po prostu dowiedzieć się, że jakiś proces został uśpiony na pewien czas, aby IO mogło się zakończyć, ponieważ którykolwiek z procesorów mógł go uśpić. W jaki sposób potwierdzany jest ten status „oczekujących operacji we / wy”?


3
„Proces jest uruchamiany na jednym procesorze”. Nie całkiem. Wątek jest uruchamiany na jednym rdzeniu procesora, ale nowoczesne procesy mają wiele wątków, a nowoczesne procesory mają wiele rdzeni.
MSalters

@MSalters Nawet wtedy, gdy pojedynczy wątek może być wykonywany tylko na jednym rdzeniu w dowolnym momencie, rdzeń, na którym wykonuje, może ulec zmianie po zmianie kontekstu.
JAB,

1
Istnieje coś takiego, zwanego żądaniem przerwania (IRQ), ale może to być więcej sprzętu niż jesteśmy zainteresowani.
mathreadler,

Odpowiedzi:


33

Procesor nic o tym nie wie, tak jak planista zadań.

Przytaczana definicja jest nieco myląca; bieżąca strona procfs(5)podręcznika ma dokładniejszą definicję, z zastrzeżeniami:

iowait (od Linuksa 2.5.41)

(5) Czas oczekiwania na zakończenie operacji we / wy. Ta wartość nie jest wiarygodna z następujących powodów:

  1. Procesor nie będzie czekał na zakończenie operacji we / wy; iowaitto czas oczekiwania zadania na zakończenie operacji we / wy. Kiedy procesor przechodzi w stan bezczynności dla zaległych operacji we / wy, na tym procesorze zostanie zaplanowane inne zadanie.

  2. W procesorze wielordzeniowym zadanie oczekujące na zakończenie operacji we / wy nie jest uruchamiane na żadnym procesorze, dlatego iowaittrudno jest obliczyć każdy procesor.

  3. Wartość w tym polu może się zmniejszyć w niektórych warunkach.

iowaitogólnie próbuje zmierzyć czas spędzony na oczekiwaniu na We / Wy. Nie jest śledzony przez konkretny procesor, ani nie może być (punkt 2 powyżej - który również pasuje do tego, co zastanawiasz się). Jest on mierzony na procesor, o ile to możliwe.

Harmonogram zadań „wie”, że oczekuje na operacje we / wy, ponieważ wie, że zawiesił dane zadanie, ponieważ oczekuje na operacje we / wy. Jest to śledzone według zadania w in_iowaitpolu task_struct; możesz poszukać in_iowaitw rdzeniu programu planującego, aby zobaczyć, jak to jest ustawione, śledzone i czyszczone. Niedawny artykuł Brendana Gregga na temat średnich obciążeń systemu Linux zawiera przydatne informacje ogólne. iowaitWpis /proc/stat, który właśnie kończy się top, gdy zwiększana jest kleszcz zegar jest rozliczane, a obecny proces „on” CPU jest bezczynny; możesz to zobaczyć, szukając account_idle_timew kodzie śledzenia czasu procesora programu planującego .

Bardziej dokładna definicja to „czas spędzony na tym procesorze na oczekiwaniu na operacje we / wy, kiedy nie ma nic lepszego do zrobienia” ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.