Найти процесс, который грузит диск
Порядок общий для всех ресурсов — в system-monitoring.
iostat показывает загрузку дисков — запросы, задержку, %util; pidstat — процессор, память и диск по процессам.
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 печатает два десятка столбцов. На машине тренажёра 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 — для сброса кэша устройства.
-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 100 у диска, который выполняет один запрос за раз (HDD), значит
предел. Диски, которые берут много запросов разом (SSD, NVMe, виртуальные
диски), при 100 % могут успевать больше. Признак настоящей перегрузки —
растут await и aqu-sz: запросы стоят в очереди. На машине тренажёра
при %util 84 запрос ждал 0.13 мс, очередь была меньше единицы.
| 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:
| 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 задаёт процессу класс доступа к диску: realtime (-c1),
best-effort (-c2, по умолчанию) и idle (-c3 — только когда диск
никому не нужен).
none — класс не задан, процесс работает как best-effort. Класс
учитывает планировщик ввода-вывода диска. У vda на машине тренажёра —
mq-deadline, у loop-устройств — none, и там приоритеты не действуют:
Основные ключи обеих команд — в таблице ниже, группы 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 |
Ничего не найдено. Попробуй запрос короче.
Порядок общий для всех ресурсов — в system-monitoring.
nice снижает долю процессора, ionice — долю диска; для резервной
копии на рабочем сервере нужны обе.
Две причины. Процесс чужой — без sudo его счётчики не прочитать.
Процесс ничего не читал и не писал за интервал — pidstat печатает только
активных; -p <PID> покажет и бездействующий.
Это средние с момента загрузки: в них попала вся загрузка системы. Смотри
следующие отчёты или добавь -y.
Устройство выполняет запросы параллельно, %util считает только время,
когда занято хоть что-то. Смотри await и aqu-sz.
Планировщик диска none не учитывает классы: проверь
/sys/block/<диск>/queue/scheduler. Запись через кэш страниц уходит на
диск позже и от имени ядра, класс процесса на неё действует слабо.
iotop на машине тренажёра не установлен. То же по процессам даёт
sudo pidstat -d 1.
vmstat.D, wa и очередь к процессору.nice, renice, ionice.df и du.Есть неточность? Сообщить об ошибке в статье