Где взять iostat и чем он отличается в Linux и macOS
В Linux утилита iostat поставляется в пакете sysstat. На многих системах пакет не установлен по умолчанию, и команда отвечает, что она не найдена. Установка выполняется штатным менеджером пакетов вашего дистрибутива, а название пакета обычно совпадает: sysstat.
В macOS iostat уже есть в системе, но это другая реализация. Вывод там компактнее: для каждого диска показываются объём за операцию, число операций в секунду и мегабайты в секунду, затем доли процессора. Интервал задаётся ключом -w, а число повторов ключом -c. Ключ -x с таблицей расширенных показателей, привычный по Linux, в macOS не работает так же, поэтому описанные ниже столбцы относятся к Linux. Учтите и ловушку с одинаковыми буквами: ключ -c в macOS задаёт число повторов, а в Linux (sysstat) выводит только блок процессора, так что команды из одной системы нельзя переносить в другую без проверки по man iostat.
Если вам нужна утилита для быстрой проверки на чужой машине, где нет прав на установку пакетов, в Linux часть сведений можно получить из файла /proc/diskstats, но читать его сложнее. Обычно проще попросить администратора поставить sysstat или воспользоваться vmstat, который часто уже установлен.
Запуск и первый отчёт, который лучше пропустить
Типичный вызов в Linux выглядит так: iostat -x 1. Он печатает расширенную статистику каждую секунду. Как и у vmstat, первый отчёт содержит усреднённые значения с момента загрузки системы, и его оценивают отдельно от остальных.
Несколько полезных вариантов запуска:
- iostat -x 2 5 даёт пять отчётов с интервалом в две секунды и завершается сам.
- iostat -d 1 выводит только данные по устройствам, без блока процессора.
- iostat -c 1 выводит только блок процессора.
- iostat -xz 1 скрывает устройства, на которых в интервале не было активности, что сокращает шум.
- iostat -p sda 1 показывает разбивку по разделам указанного диска; имя устройства подставьте своё.
Названия устройств зависят от системы: sda и nvme0n1 типичны для Linux, loop-устройства относятся к смонтированным образам, например к пакетам snap. Если вывод кажется слишком длинным, укажите имя нужного диска в конце команды: iostat умеет ограничивать отчёт перечисленными устройствами.
Столбцы расширенного режима
Набор столбцов -x различается между версиями sysstat: в старых вариантах встречаются avgqu-sz и svctm, в новых aqu-sz. Сверяйтесь с man iostat на своей машине. Общая логика остаётся такой.
| Столбец | Смысл |
|---|---|
| r/s, w/s | число запросов чтения и записи в секунду |
| rkB/s, wkB/s | объём чтения и записи, килобайт в секунду |
| await (в новых версиях r_await, w_await) | среднее время ожидания запроса вместе со временем в очереди, мс |
| aqu-sz (или avgqu-sz) | средняя длина очереди запросов к устройству |
| %util | доля времени, когда устройство было занято обработкой запросов |
Для накопителей с одной очередью, например жёстких дисков, значение %util около 100% вместе с растущим await говорит о насыщении. Для NVMe и массивов с параллельной обработкой этот показатель ведёт себя иначе: устройство способно обрабатывать несколько запросов одновременно, и %util около 100% не означает исчерпанного запаса. Оценивать в таком случае лучше по await и очереди.
Доли процессора в блоке avg-cpu включают %iowait. Это время простоя процессора, пока система ожидала ввода-вывода. Оно сигнализирует об ожидании диска, но не говорит, какой именно процесс его вызвал.
Как связать цифры iostat с реальными жалобами
Пример рассуждения без привязки к конкретным числам. Программа запускается дольше обычного, в интерфейсе микрозадержки. Вы открываете iostat -x 1 и видите, что на одном диске await заметно выросло по сравнению с обычным уровнем на этой же машине, а очередь не пуста. Следующий вопрос: кто создаёт нагрузку.
Для поиска процесса в Linux подойдёт pidstat -d из того же пакета sysstat или утилита iotop, если она установлена и у вас есть права администратора. Если lsof установлена (в macOS она есть в системе, в Linux её иногда нужно доустановить), она покажет, какие файлы держат открытыми процессы. На странице про lsof разобран просмотр открытых файлов процесса.
Сравнивать нужно с вашим же обычным состоянием: у домашнего SSD и у сетевого хранилища в офисе нормы разные, и универсального порога await нет. Поэтому полезно один раз записать вывод в спокойное время и хранить как ориентир.
Если ошибки чтения и записи повторяются, вместе с задержками смотрите журнал ядра командой dmesg: там фиксируются сбросы шины и ошибки ввода-вывода. Это признак проблем с накопителем, кабелем или контроллером, и тогда нужна резервная копия данных.
Типичные ошибки интерпретации
Первая ошибка: оценивать диск по первому отчёту, где значения усреднены с загрузки. Вторая: считать любой высокий %util признаком проблемы без учёта типа накопителя. Третья: сравнивать числа между разными машинами. Четвёртая: игнорировать кэш файловой системы. Если программа читает данные, которые уже лежат в кэше, обращений к диску в iostat не будет, и вывод покажет тишину при высокой скорости работы.
Ещё одна ловушка в том, что iostat видит блочные устройства, а не файлы. Поэтому нагрузка на сетевые диски, смонтированные по сети, в нём может отсутствовать: для них в Linux есть nfsiostat, а в общем случае нужно смотреть статистику самого протокола. Разделы под управлением LVM и RAID отображаются как отдельные устройства, и их цифры частично повторяют цифры физических дисков.
Если нужен общий взгляд на систему перед детальной проверкой диска, начните со страницы про uptime и load average, затем посмотрите vmstat, а iostat используйте как уточняющий шаг.
Минимальный порядок проверки диска
Чтобы не потеряться среди столбцов, придерживайтесь короткой последовательности действий.
- Запустите iostat -xz 1 и пропустите первый отчёт.
- Найдите устройство, на котором есть активность, и сравните await и очередь с обычным состоянием.
- Посмотрите %iowait в блоке процессора, чтобы понять, ждёт ли система диск.
- Найдите процесс-источник нагрузки через pidstat -d, iotop или lsof.
- Проверьте dmesg на ошибки накопителя.
Если ошибок нет, а задержки связаны с вашей же задачей, например копированием большого каталога, это ожидаемое поведение, и достаточно дождаться завершения или запускать такие задачи в удобное время.