С чего начать Первые шаги трек · 15 ступеней
Linux Labs

iostat и pidstat — какой диск занят и какой процесс его грузит

8 мин sysstat 12.6 · Ubuntu 24.04

iostat показывает загрузку дисков — запросы, задержку, %util; pidstat — процессор, память и диск по процессам.

Шпаргалка

8 команд Версия для печати
  • iostat -dxsy 1 5 диски: tps, kB/s, await, aqu-sz, %util
  • iostat -x vda 1 3 все поля одного диска
  • sudo pidstat -dl 1 5 кто читает и пишет, команда целиком
  • pidstat -u 1 5 процессор по процессам, %wait
  • pidstat -r 1 5 память и page faults по процессам
  • pidstat -d -p 1151 1 5 один процесс
  • ionice -p 1151 класс приоритета диска процесса
  • sudo ionice -c3 -p 1151 отдать диск остальным (idle)

Обзор

iostat и pidstat — команды пакета sysstat. iostat смотрит на устройства: сколько запросов, сколько данных, как долго ждали ответа. pidstat смотрит на процессы: кто тратит процессор, память и диск.

Обе принимают интервал и число отчётов: iostat 1 5 — пять отчётов раз в секунду. Без интервала — один отчёт со средними с момента загрузки системы. Первый отчёт iostat с интервалом — тоже средние с загрузки; ключ -y его пропускает.

iostat -x: поля устройства

iostat -x печатает два десятка столбцов. На машине тренажёра dd писал на диск блоками по 4 КиБ мимо кэша (oflag=direct):

Поле Значение Что значит
w/s 6844.00 запросов записи в секунду
wkB/s 27376.00 записано КиБ в секунду
w_await 0.13 среднее время запроса записи, мс: очередь и работа устройства
wareq-sz 4.00 средний размер запроса, КиБ
aqu-sz 0.86 средняя длина очереди к устройству
%util 84.00 доля времени, когда устройство было занято

Те же поля с r — для чтения (r/s, rkB/s, r_await), с d — для discard, с f — для сброса кэша устройства.

iostat -dxs: коротко

-s сжимает -x в одну узкую строку, -d убирает блок процессора:

Device tps kB/s rqm/s await areq-sz aqu-sz %util
vda 12540.00 50160.00 0.00 0.06 4.00 0.77 70.20

tps — запросов в секунду (чтение и запись вместе), rqm/s — запросов, слитых с соседними до отправки на устройство.

Как читать %util и await

%util 100 у диска, который выполняет один запрос за раз (HDD), значит предел. Диски, которые берут много запросов разом (SSD, NVMe, виртуальные диски), при 100 % могут успевать больше. Признак настоящей перегрузки — растут await и aqu-sz: запросы стоят в очереди. На машине тренажёра при %util 84 запрос ждал 0.13 мс, очередь была меньше единицы.

pidstat -d: кто грузит диск

bash
sudo pidstat -d 2 1
UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
0 1151 0.00 32113.43 0.00 0 dd
Поле Что значит
kB_rd/s прочитано с диска, КиБ/с
kB_wr/s записано или отдано в кэш на запись, КиБ/с
kB_ccwr/s отменённая запись: файл удалили раньше, чем данные дошли до диска
iodelay сколько тиков процесс ждал ввод-вывод

Счётчики ввода-вывода чужого процесса читает только root. Тот же dd от root без sudo не виден: pidstat -d печатает одни заголовки.

К какой службе относится найденный процесс, показывает ps:

text
student@ubuntu:~$ ps -o pid,unit,comm -p 1211
    PID UNIT                            COMMAND
   1211 ssh.service                     sshd

pidstat -u: кто ждёт процессор

bash
pidstat -u 1 2      # итог Average, часть столбцов опущена
UID PID %usr %system %wait %CPU Command
1000 975 48.76 0.00 51.24 48.76 stress-ng-cpu
1000 976 48.76 0.00 51.24 48.76 stress-ng-cpu

Два процесса на одном процессоре: каждый половину времени работал (%usr), половину ждал своей очереди (%wait). Высокий %wait — процессов в R больше, чем процессоров (см. load-average).

pidstat -r показывает память по процессам: minflt/s и majflt/s — обращения к страницам без диска и с диском, VSZ, RSS, %MEM. pidstat -w — переключения задач: cswch/s (процесс сам уступил процессор, ждёт ввода-вывода или события) и nvcswch/s (у него процессор забрали).

ionice: приоритет диска

ionice задаёт процессу класс доступа к диску: realtime (-c1), best-effort (-c2, по умолчанию) и idle (-c3 — только когда диск никому не нужен).

text
student@ubuntu:~$ ionice -p 1
none: prio 0
student@ubuntu:~$ sudo ionice -c3 -p $$; ionice -p $$
idle

none — класс не задан, процесс работает как best-effort. Класс учитывает планировщик ввода-вывода диска. У vda на машине тренажёра — mq-deadline, у loop-устройств — none, и там приоритеты не действуют:

text
student@ubuntu:~$ cat /sys/block/vda/queue/scheduler
none [mq-deadline]

Ключи

15

Основные ключи обеих команд — в таблице ниже, группы iostat и pidstat. Полный список — man iostat, man pidstat.

Ключ Что делает Пример
-x Подробная статистика устройств — запросы, задержка await, очередь aqu-sz, %util. iostat -x vda 1 3
-d Ввод-вывод по процессам — kB_rd/s, kB_wr/s, iodelay; чужие процессы видны только root. sudo pidstat -d 1 5
-u Процессор по процессам — %usr, %system, %wait (ждал процессор), %CPU. pidstat -u 1 5
-d Только устройства, без блока avg-cpu. iostat -dx 1 3
-s Короткий вид с -x — tps, kB/s, await, aqu-sz, %util в одну узкую строку. iostat -dxs 1 3
-y Пропустить первый отчёт — средние с момента загрузки. iostat -dxsy 1 3
-z Не печатать устройства без операций за интервал. iostat -dxz 1
-r Память по процессам — page faults в секунду, VSZ, RSS, %MEM. pidstat -r 1 5
-p PID Только указанные процессы; ALL — все, включая бездействующие. pidstat -d -p 1151 1 5
-l Показывать команду целиком, с аргументами. sudo pidstat -dl 1 5
-p DEV Статистика по разделам устройства. iostat -p vda
-h Размеры с единицами — k, M, G; имя устройства в конце строки. iostat -h
-w Переключения задач — добровольные cswch/s и вынужденные nvcswch/s. pidstat -w 1 5
-t Статистика и по потокам процесса. pidstat -t -p 1 1 3
-v Число потоков и открытых дескрипторов у процессов. pidstat -v

Ничего не найдено. Попробуй запрос короче.

Рецепты

3

Найти процесс, который грузит диск

bash
vmstat 1 5                # wa высокий, b больше 0?
iostat -dxsy 1 3          # какой диск: %util, await
sudo pidstat -dl 1 5      # какой процесс: kB_wr/s, kB_rd/s

Порядок общий для всех ресурсов — в system-monitoring.

Понизить приоритет диска процессу

bash
sudo ionice -c3 -p 1151           # работающему процессу
ionice -c3 nice -n 19 tar czf /var/tmp/b.tgz /srv   # при запуске

nice снижает долю процессора, ionice — долю диска; для резервной копии на рабочем сервере нужны обе.

Один процесс под наблюдением

bash
pidstat -u -r -d -p 1151 1     # CPU, память и диск раз в секунду

Неполадки

5

pidstat -d ничего не показывает

Две причины. Процесс чужой — без sudo его счётчики не прочитать. Процесс ничего не читал и не писал за интервал — pidstat печатает только активных; -p <PID> покажет и бездействующий.

Первая строка iostat не похожа на остальные

Это средние с момента загрузки: в них попала вся загрузка системы. Смотри следующие отчёты или добавь -y.

%util 100, а всё работает

Устройство выполняет запросы параллельно, %util считает только время, когда занято хоть что-то. Смотри await и aqu-sz.

ionice не помогает

Планировщик диска none не учитывает классы: проверь /sys/block/<диск>/queue/scheduler. Запись через кэш страниц уходит на диск позже и от имени ядра, класс процесса на неё действует слабо.

iotop: command not found

iotop на машине тренажёра не установлен. То же по процессам даёт sudo pidstat -d 1.

См. также

  • system-monitoring — порядок разбора и vmstat.
  • load-average — состояние D, wa и очередь к процессору.
  • processes — nice, renice, ionice.
  • disk-usage — место на диске: df и du.
  • stress-ng — нагрузка на диск для опытов.
  • top — процессы в одном окне.
Загрузка…