Почему vmstat запускают с интервалом
Команда vmstat без аргументов печатает единственную строку со средними значениями с момента загрузки системы. Для диагностики она малоинформативна: короткий пик в среднем за несколько суток практически не виден. Поэтому на практике указывают интервал в секундах: vmstat 1 выводит новую строку каждую секунду, пока вы не нажмёте Ctrl+C.
Можно ограничить число строк вторым аргументом: vmstat 2 10 даст десять замеров с шагом в две секунды. Это удобно для скриптов и для отчёта, который вы потом покажете коллеге или в поддержке.
Важная особенность: первая строка при любом интервале всё равно содержит среднее с момента старта, и только следующие строки отражают то, что происходило в течение интервала. Новички часто пугаются первой строки, где цифры сильно отличаются от остальных. Её просто пропускают.
Единицы памяти по умолчанию в Linux указаны в килобайтах. Ключ -S позволяет сменить единицу: например, vmstat -S M 1 покажет мегабайты. Названия столбцов при этом не меняются.
Столбцы вывода по группам
Вывод в Linux разбит на группы столбцов. Набор столбцов может отличаться между версиями vmstat, поэтому сверяйтесь с man vmstat.
| Группа | Столбцы | Что означают |
|---|---|---|
| procs | r, b | r: процессы, готовые к выполнению; b: процессы в непрерываемом ожидании |
| memory | swpd, free, buff, cache | подкачка, свободная память, буферы, кэш файлов |
| swap | si, so | объём в секунду, прочитанный из подкачки (si) и записанный в неё (so) |
| io | bi, bo | блоки в секунду, прочитанные с устройств (bi) и записанные на них (bo) |
| system | in, cs | прерывания и переключения контекста в секунду |
| cpu | us, sy, id, wa, st | пользователь, ядро, простой, ожидание ввода-вывода, украденное время |
Столбец st заполнен в основном на виртуальных машинах: это время, которое гипервизор не дал гостевой системе. Если на физической машине там нули, это нормально.
Для macOS информация разбросана по двум утилитам. Команда vm_stat показывает счётчики страниц памяти, а штатная vmstat выводит свой набор столбцов, отличный от Linux. Не переносите значения столбцов из таблицы выше на macOS: сверяйтесь с man vmstat и man vm_stat на вашей системе.
Как по столбцам отличить нехватку процессора от нехватки памяти
Чтение вывода сводится к нескольким сопоставлениям. Они не дают диагноза, зато быстро сужают круг.
- Если r стабильно больше числа ядер, а us и sy в сумме близки к максимуму, процессор перегружен. Выясняйте, какой процесс его занимает.
- Если r небольшое, а wa высокое и b больше нуля, процессы ждут диск или сетевое хранилище. Дальше смотрите iostat.
- Если si и so устойчиво отличны от нуля, система активно использует подкачку: оперативной памяти не хватает или она занята сверх меры. Единичные значения без повторения тревогу не вызывают.
- Если free мала, но cache велик, это обычно нормальная картина: Linux использует свободную память под кэш файлов и отдаёт её при необходимости. Для оценки лучше смотреть на колонку available в выводе free.
- Если cs и in очень велики на фоне простоя процессора, возможно, много процессов или потоков постоянно просыпаются и засыпают.
Оценивайте не одну строку, а ряд из нескольких десятков секунд. Единичный всплеск при запуске программы не означает проблемы, а повторяющаяся картина говорит о системной причине.
Практический сценарий: ноутбук с вентилятором на максимуме
Допустим, вентилятор шумит, а интерфейс отвечает с задержками. Откройте терминал и запустите vmstat 1 на полминуты. Дальше возможны три типичных картины.
Первая: us высок, wa близок к нулю, r больше числа ядер. Это вычислительная задача, например сборка проекта, кодирование видео или зациклившийся процесс. Найдите его через top или ps aux, отсортированный по процессору.
Вторая: wa высок, us невысок. Скорее всего, идёт интенсивная работа с диском: индексация, антивирусная проверка, резервная копия, обновление. Проверьте, какой процесс пишет или читает, с помощью iostat и lsof.
Третья: si и so ненулевые, а free близка к нулю. Памяти не хватает. Закройте тяжёлые приложения, а на постоянной основе оцените, достаточно ли оперативной памяти для ваших задач. Подробности о памяти есть на странице про free, а о перегрузке процессора и скачках нагрузки на странице про uptime и load average.
Если вы обращаетесь за помощью на форум или в поддержку, приложите вывод vmstat 1 за 30 секунд: по нему видно динамику и не нужно угадывать.
Ограничения утилиты и что делать дальше
vmstat показывает картину по системе в целом, а не по процессам. Он не назовёт виновника, а лишь подскажет, в какую сторону копать. Для конкретного процесса используют ps, top, pidstat из пакета sysstat или lsof.
Есть и другие ограничения. Данные о диске в vmstat агрегированные: bi и bo отражают суммарный поток блоков, но не показывают, какое именно устройство занято. Для разбивки по дискам нужен iostat. Столбец wa относится к ожиданию на процессоре и тоже усреднён по ядрам.
Внутри контейнеров и виртуальных машин цифры могут отражать хост, а не только вашу среду, поэтому сравнивайте их с настройками лимитов. Для длительного наблюдения вместо vmstat лучше использовать систему мониторинга, которая хранит историю.
Если вы только начинаете, сохраните привычку: сначала uptime, затем vmstat 1, затем конкретика через ps и iostat. Такой порядок даёт общую картину, прежде чем вы углубитесь в детали.
Как сохранить замер для обращения в поддержку
Иногда проблему нужно показать другому человеку. Пара приёмов делает такой отчёт понятным.
- Запустите vmstat 1 30 и сохраните вывод в файл через перенаправление: vmstat 1 30 > замер.txt.
- Добавьте в файл дату командой date, чтобы было видно, когда сделан замер.
- Укажите, что происходило в это время: какая программа была запущена, какие действия выполнялись.
- Приложите вывод uptime и, при подозрении на диск, фрагмент iostat.
- Не удаляйте первую строку, а лучше отметьте, что она содержит среднее с загрузки.
В таком виде специалист быстро поймёт, где искать, и ему не придётся просить повторить замер.