wa — это простой процессора, у которого есть причина.
Когда процессору нечего делать, он простаивает, и ядро записывает это время в id. Если в этот момент какой-то процесс ждёт ответа диска, тот же простой идёт в wa — iowait. Сам процесс, который ждёт диск, находится в состоянии D: его считают столбец b у vmstat и load average.
Столбцы bi и bo — сколько КиБ в секунду машина читает с диска и пишет на него. В опыте bo — несколько тысяч, всего несколько МБ/с, а диск при этом занят всё время. Выгрузка пишет блоками по 4 КиБ и после каждого ждёт, пока блок дойдёт до диска, — так пишут журналы баз данных. Каждая запись короткая, но ожиданий сотни в секунду, и почти всё время у диска есть работа.
Большой wa не значит, что процессор занят. Это простой, и любая задача, которой нужен процессор, получит его сразу.
Пока выгрузка ждёт диск, ты запускаешь stress-ng --cpu 1 --timeout 15s — расчёт, который занимает процессор целиком. Что vmstat покажет в группе cpu?
-
Ожидание процессор не занимает: wa — это простой. Расчёт забирает его, и vmstat показывает us около 97 и wa 0.
-
Делить нечего: простой забирает любая задача, которой нужен процессор. Расчёт получает почти всё время — us около 97, wa 0.
wa — время простоя, и расчёт забирает его целиком: vmstat показывает us около 97 и wa 0. В bo при этом по-прежнему тысячи — выгрузка пишет, как писала. Проверь сам: stress-ng --cpu 1 --timeout 15s &, затем vmstat 1 5.
Главное в шаге
- wa — время, когда процессор простаивает, а процесс ждёт диск; задачам, которым нужен процессор, большой wa не мешает.
- Процесс, который ждёт диск, — в состоянии D; его считают столбец b и load average.
- bi и bo — чтение и запись в КиБ в секунду; мелкие записи с ожиданием каждой занимают диск при малом объёме.