vmstat и sar: классические инструменты анализа производительности
vmstat и sar — две классические утилиты Linux для анализа производительности сервера. Они не рисуют красивые графики, не требуют агента с веб-интерфейсом и не заменяют полноценный мониторинг, зато быстро отвечают на главный вопрос во время инцидента: система упирается в CPU, память, диск, swap или планировщик?
vmstat удобен для мгновенной диагностики «здесь и сейчас». Одна команда показывает очередь процессов, использование процессора, память, swap и базовую дисковую активность. sar, наоборот, полезен как «чёрный ящик»: он хранит исторические метрики и позволяет посмотреть, что происходило на сервере утром, ночью или за несколько минут до падения.
Эти инструменты особенно полезны, когда внешний мониторинг доступности уже сообщил о проблеме, но причина не очевидна. Например, Statuser может проверять сайт с заданным интервалом и прислать уведомление о сбое, а дальше администратор заходит на сервер и с помощью vmstat и sar выясняет, была ли проблема в нехватке ресурсов, дисковом I/O или системной нагрузке.
Когда использовать vmstat и sar
vmstat и sar решают близкие, но разные задачи.
vmstat показывает текущее состояние системы. Его запускают, когда сервер уже «тормозит», выросла задержка API, начали сыпаться 502, 503 или база отвечает медленно. Команда компактная, доступна почти везде и хорошо подходит для первого среза.
Пример:
vmstat 1Такой запуск выводит статистику каждую секунду. Через несколько строк уже видно, где искать проблему: в очереди CPU, swap, диске или контекстных переключениях.
sar входит в пакет sysstat и собирает статистику в фоне. Его используют, когда нужно ответить на вопрос «что было раньше?». Например, приложение уже восстановилось, но ночью был всплеск ошибок. Если сбор sar был включён заранее, можно посмотреть CPU, память, диск, сеть и load average за нужный период.
Пример:
sar -u -s 03:00:00 -e 04:00:00Команда покажет статистику CPU с 03:00 до 04:00.
Практическое разделение простое:
1) vmstat для live-диагностики — когда вы прямо сейчас подключились к серверу и хотите понять, что происходит.
2) sar для ретроспективы — когда инцидент уже прошёл или нужно сравнить текущую картину с обычным поведением.
3) Оба инструмента вместе — когда sar показывает исторический всплеск, а vmstat помогает проверить, сохраняется ли проблема сейчас.
Если вы выстраиваете мониторинг системно, полезно сочетать такие утилиты с метриками приложения и внешними проверками. Об общей логике метрик можно почитать в статье про четыре золотых сигнала в мониторинге.
Установка и базовый запуск
На многих Linux-серверах vmstat уже установлен, потому что входит в пакет procps или procps-ng. Проверить можно так:
vmstat --versionЕсли команды нет, установите пакет стандартным менеджером.
Для Debian и Ubuntu:
sudo apt update
sudo apt install procps sysstatДля RHEL, AlmaLinux, Rocky Linux, CentOS:
sudo dnf install procps-ng sysstatДля старых систем может использоваться yum:
sudo yum install procps-ng sysstatПосле установки vmstat сразу готов к работе. Самые полезные варианты запуска:
vmstat
vmstat 1
vmstat 1 10
vmstat -S M 1Что они делают:
1) vmstat — выводит один снимок статистики. Первый вывод часто содержит усреднённые значения с момента загрузки системы, поэтому для текущей диагностики он не всегда показателен.
2) vmstat 1 — обновляет данные каждую секунду до остановки через Ctrl+C.
3) vmstat 1 10 — делает 10 замеров с интервалом 1 секунда.
4) vmstat -S M 1 — показывает память в мегабайтах, что удобнее для чтения на больших серверах.
С sar есть важный нюанс: пакет sysstat нужно не только установить, но и включить сбор статистики.
В Debian/Ubuntu проверьте файл:
cat /etc/default/sysstatЕсли там указано ENABLED="false", поменяйте на:
ENABLED="true"Затем перезапустите сервис:
sudo systemctl enable --now sysstat
sudo systemctl restart sysstatНа системах с systemd сбор может быть организован через таймеры:
systemctl status sysstat
systemctl list-timers | grep sysstatПроверить, появились ли данные, можно командой:
sarЕсли статистика ещё не накопилась, подождите несколько минут. Исторические файлы обычно лежат в /var/log/sysstat/ или /var/log/sa/ — зависит от дистрибутива.
Как читать вывод vmstat
Типичный вывод vmstat 1 выглядит так:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 524000 120000 1800000 0 0 1 20 900 1800 15 5 78 2 0
8 1 0 300000 110000 1700000 0 0 120 800 2500 9000 70 15 5 10 0Разберём основные группы.
1) procs: очередь процессов
Колонки:
r— процессы, готовые выполняться и ожидающие CPU;b— процессы в непрерываемом ожидании, чаще всего I/O.
r нужно сравнивать с числом CPU-ядер или потоков. Если на сервере 4 vCPU, а r стабильно держится на уровне 8–12, CPU может быть узким местом. Разовый скачок не страшен, важна устойчивость во времени.
b показывает процессы, которые ждут не процессор, а обычно диск или блочное устройство. Если b растёт вместе с wa, стоит смотреть дисковую подсистему.
Подробнее о том, как интерпретировать общую нагрузку, полезно читать вместе со статьёй что такое load average в Linux. vmstat не заменяет load average, но помогает понять, из чего эта нагрузка состоит.
2) memory: память
Колонки:
swpd— объём используемого swap;free— свободная память;buff— память под буферы;cache— page cache.
Новички часто пугаются малого free, но в Linux это нормально: свободная память используется под кэш. Смотреть нужно не только на free, а на поведение swap и давление на память.
Если free маленький, но si и so равны нулю, система может работать нормально. Если же активно растут si и so, начинается обмен со swap — это уже сигнал.
3) swap: обмен со swap
Колонки:
si— сколько данных читается из swap;so— сколько записывается в swap.
Сам факт ненулевого swpd не всегда проблема. Сервер мог когда-то выгрузить неактивные страницы в swap и больше их не трогать. Опасны постоянные ненулевые si и so, особенно если одновременно растёт latency приложения.
Активный swap часто даёт «вязкие» симптомы: CPU может быть не загружен полностью, но приложение отвечает медленно, запросы копятся, health check иногда проходит, иногда нет.
4) io: блочный ввод-вывод
Колонки:
bi— блоки, прочитанные с блочных устройств;bo— блоки, записанные на блочные устройства.
Эти показатели дают только грубую картину. Они полезны как индикатор: есть ли вообще активный дисковый I/O. Для детальной диагностики лучше подключать iostat, iotop и метрики latency. На эту тему есть отдельный разбор: iostat и iotop для диагностики дисковой нагрузки.
5) system: прерывания и переключения контекста
Колонки:
in— interrupts, прерывания;cs— context switches, переключения контекста.
Высокие значения сами по себе не означают проблему. Их нужно сравнивать с обычным поведением сервера. Резкий рост cs может указывать на большое количество мелких задач, частые блокировки, сетевую активность, проблемы с потоками или слишком большое число процессов.
6) cpu: распределение процессорного времени
Колонки:
us— пользовательское время;sy— системное время ядра;id— простой CPU;wa— ожидание I/O;st— stolen time, время, «украденное» гипервизором.
Если us высокий, CPU занят приложением. Если sy высокий, много времени уходит в ядро: сеть, файловая система, системные вызовы, контейнеризация, firewall, драйверы. Если высокий wa, CPU ждёт диск. Если высокий st, проблема может быть на уровне виртуализации: соседние VM на хосте, перепроданные ресурсы или ограничения провайдера.
Практические сценарии с vmstat
vmstat ценен не отдельной колонкой, а сочетанием признаков. Ниже — типовые картины, которые встречаются в продакшене.
1) CPU насыщен
Признаки:
rстабильно выше числа CPU;us + syблизко к 100%;idпочти нулевой;waнизкий.
Команда:
vmstat 1 20Если картина держится все 20 секунд, CPU действительно насыщен. Следующий шаг — найти процессы:
top
htop
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | headДля интерактивного просмотра удобнее использовать htop; подробный гайд есть в статье htop: мониторинг процессов.
2) Сервер ждёт диск
Признаки:
- высокий
wa; - заметный
b; - активные
biилиbo; - приложение тормозит, хотя CPU не полностью занят.
Такое часто бывает при тяжёлых запросах к базе, массовой записи логов, бэкапах, нехватке IOPS на VPS, медленном сетевом диске.
Следующие команды:
iostat -xz 1
iotop -oPaЕсли проблема в latency диска, одного vmstat мало. Смотрите await, %util, очередь и процессы, которые генерируют I/O. Подробнее о диагностике задержек диска — в материале I/O latency: как измерять и находить узкие места.
3) Начался swap storm
Признаки:
siиsoпостоянно ненулевые;freeнизкий;waможет расти;- latency приложения резко увеличивается;
- иногда появляется OOM Killer.
Проверка:
free -h
vmstat -S M 1
dmesg -T | grep -i -E 'oom|killed process'Дальше нужно искать, кто съел память:
ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | head -20Если процесс периодически умирает от нехватки памяти, полезно разобраться, как работает OOM Killer в Linux.
4) Высокий st на виртуальной машине
Признаки:
stзаметно выше нуля и держится;- приложение тормозит без явного упора в собственный CPU;
rможет расти, но процессы фактически не получают процессорное время.
На bare metal st должен быть нулевым. Если он растёт на VPS, значит гипервизор отдаёт CPU другим гостевым машинам. Варианты ограничены: сменить тариф, перенести нагрузку, обратиться к провайдеру, проверить лимиты CPU.
5) Много переключений контекста
Признаки:
- резко вырос
cs; syвыше обычного;- много потоков или процессов;
- возможна высокая сетевая активность.
Сначала проверьте процессы:
pidstat -w 1
pidstat -t -p ALL 1pidstat тоже входит в sysstat и помогает увидеть context switches по процессам и потокам.
sar: как смотреть историю системных метрик
sar хранит собранную статистику в бинарных файлах, которые потом можно просматривать разными ключами — в этом его главное отличие от vmstat. Если сайт был недоступен пять минут, а сейчас всё нормально, live-команды уже ничего не покажут, а sar подскажет, был ли всплеск CPU, swap, I/O или сети.
Базовые команды:
sar
sar -u
sar -r
sar -S
sar -b
sar -d
sar -n DEV
sar -qЧто они показывают:
1) sar -u — CPU: пользовательское время, системное время, ожидание I/O, простой, stolen time.
Пример:
sar -u 1 5Это похоже на CPU-блок в vmstat, но sar также умеет читать историю:
sar -u -s 10:00:00 -e 11:00:002) sar -r — память: свободная память, used memory, buffers, cache, commit.
sar -rЭта команда полезна для поиска плавных утечек памяти. Если kbmemused растёт часами, а затем процесс падает или начинается swap, есть повод смотреть приложение.
3) sar -S — swap.
sar -SПоказывает использование swap во времени. Но для активности обмена лучше смотреть paging:
sar -W
sar -B-W покажет swap in/out, а -B — paging-активность.
4) sar -b и sar -d — дисковая активность.
sar -b
sar -d -p-b даёт общую статистику I/O, -d — по устройствам. Ключ -p делает имена устройств более читаемыми, например sda, nvme0n1.
5) sar -n DEV — сетевые интерфейсы.
sar -n DEVМожно увидеть входящий и исходящий трафик по интерфейсам. Для ошибок и дропов полезны дополнительные сетевые отчёты:
sar -n EDEV
sar -n TCP,ETCPЕсли проблема похожа на сетевую, sar даст базовую историю, а дальше стоит использовать специализированные инструменты. Например, для анализа сетевого трафика есть tcpdump, а для мониторинга пропускной способности — iftop, nload и vnstat.
6) sar -q — load average и очередь.
sar -qКоманда показывает runq-sz, plist-sz, load average за 1, 5 и 15 минут. Это удобно для сравнения с vmstat r: sar показывает историю очереди, vmstat — текущую динамику.
Как посмотреть данные sar за нужный период
sar по умолчанию показывает данные за текущий день. Можно ограничивать интервал:
sar -u -s 14:00:00 -e 14:30:00Если нужно открыть файл за конкретный день, используйте -f.
На Debian/Ubuntu:
sar -u -f /var/log/sysstat/sa27На RHEL-подобных системах:
sar -u -f /var/log/sa/sa27Где sa27 — файл за 27-е число месяца.
Полезные шаблоны:
sar -u -f /var/log/sysstat/sa27 -s 02:00:00 -e 03:00:00
sar -r -f /var/log/sysstat/sa27 -s 02:00:00 -e 03:00:00
sar -d -p -f /var/log/sysstat/sa27 -s 02:00:00 -e 03:00:00
sar -n DEV -f /var/log/sysstat/sa27 -s 02:00:00 -e 03:00:00Для расследования инцидента удобно идти по слоям:
1) Начните с CPU
sar -u -s 02:00:00 -e 03:00:00Смотрите iowait, %idle, %steal, соотношение %user и %system.
2) Проверьте очередь и load average
sar -q -s 02:00:00 -e 03:00:00Если load вырос, но CPU был свободен, причина может быть в I/O или блокировках.
3) Проверьте память и swap
sar -r -s 02:00:00 -e 03:00:00
sar -W -s 02:00:00 -e 03:00:00Активный swap в момент деградации — сильный сигнал.
4) Посмотрите диск
sar -d -p -s 02:00:00 -e 03:00:00Если виден всплеск операций или загрузки устройства, сопоставьте его с бэкапами, cron-задачами, ротацией логов, тяжёлыми SQL-запросами.
5) Посмотрите сеть
sar -n DEV -s 02:00:00 -e 03:00:00
sar -n TCP,ETCP -s 02:00:00 -e 03:00:00Это помогает отличить локальную нехватку ресурсов от всплеска трафика, retransmits или ошибок сетевого уровня.
Если внешний мониторинг показал недоступность сайта, а пользователи жаловались на таймауты, полезно сопоставить время уведомления с системными метриками. Сервис вроде Statuser фиксирует факт недоступности снаружи, а sar помогает понять, что происходило внутри сервера в тот же момент.
Связка vmstat, sar и других инструментов
vmstat и sar хороши как первый и второй уровень диагностики. Но они не должны быть единственными инструментами.
Рабочая схема может выглядеть так:
1) Получили сигнал о проблеме
Это может быть алерт от внешней проверки, жалоба пользователя, рост 5xx, медленные запросы в APM или падение health check. Если вы ещё не используете внешние проверки, базовые принципы описаны в статье что такое uptime monitoring и как он работает.
2) Сняли текущий срез через vmstat
vmstat -S M 1 30За 30 секунд видно, есть ли устойчивый паттерн: CPU, диск, swap, stolen time.
3) Проверили историю через sar
sar -u -s 12:00:00 -e 12:30:00
sar -q -s 12:00:00 -e 12:30:00
sar -r -s 12:00:00 -e 12:30:00
sar -d -p -s 12:00:00 -e 12:30:00Так вы понимаете, проблема началась внезапно или нарастала.
4) Уточнили виновника специализированными утилитами
- CPU и процессы:
top,htop,pidstat,perf; - диск:
iostat,iotop,pidstat -d; - сеть:
ss,tcpdump,iftop; - память:
free,smem,pmap, логи OOM; - сервисы:
journalctl, логи приложения.
5) Сопоставили с изменениями
Проверьте деплой, cron, бэкапы, миграции, ротацию логов, обновления пакетов, изменение трафика, действия в базе. Метрики без контекста часто показывают симптом, но не причину.
Если расследование не ограничивается одним сервером, полезен пошаговый подход из материала как расследовать деградацию производительности по метрикам.
Типичные ошибки при интерпретации
У vmstat и sar простой интерфейс, но ошибиться в выводах легко.
1) Делать вывод по первой строке vmstat
Первый вывод vmstat часто отражает средние значения с момента загрузки, а не текущую секунду. Для диагностики запускайте vmstat 1 10 или vmstat 1 30 и анализируйте последующие строки.
2) Считать любой swap проблемой
Ненулевой swpd не означает катастрофу. Проблема — активный обмен: ненулевые si и so, рост задержек, падение производительности.
3) Оценивать CPU без iowait и steal
Если %idle низкий, это ещё не всегда «приложение съело CPU». Смотрите us, sy, wa, st. Высокий wa ведёт к диску, высокий st — к гипервизору, высокий sy — к ядру и системным операциям.
4) Игнорировать базовую линию
Значение cs, in, bi, bo само по себе мало что говорит. Для одного сервера 5000 context switches в секунду нормально, для другого — аномалия. История sar помогает понять норму.
5) Путать причину и следствие
Высокий load average может быть следствием дискового ожидания, а не нехватки CPU. Рост сетевого трафика может быть не атакой, а результатом ретраев клиентов после деградации базы. Всегда проверяйте несколько метрик вместе.
6) Ждать от sar детализации уровня APM
sar показывает системные метрики, но не скажет, какой SQL-запрос медленный или какой endpoint генерирует нагрузку. Для этого нужны логи, трассировки, профилировщики, метрики приложения и базы.
FAQ
Что лучше использовать: vmstat или sar?
Для текущей диагностики — vmstat. Для анализа прошлых событий — sar. На практике они дополняют друг друга.
Почему первый вывод vmstat отличается от следующих?
Первая строка часто показывает средние значения с момента загрузки системы. Для актуальной картины запускайте vmstat 1 и смотрите последующие строки.
Нужно ли постоянно держать включённым sar?
Обычно да. Он создаёт небольшую нагрузку и даёт полезную историю для расследования инцидентов. Без заранее включённого сбора прошлые метрики восстановить нельзя.
Может ли vmstat показать, какой процесс тормозит сервер?
Нет, напрямую не может. vmstat показывает состояние системы в целом. Для поиска процесса используйте top, htop, pidstat, iotop, ps и логи приложения.
Похожие статьи

Профилирование производительности в Linux с perf и flamegraph
Разбираем инструменты perf и flamegraph: как измерять CPU-бутылочные горлышки, исследовать call stack и визуализировать горячие точки исполнения кода.
22 февраля 20267 мин

Как работает ncdu. Анализ использования диска в консоли, удобнее чем du
Учимся использовать ncdu для анализа дискового пространства. Простая навигация, поиск «тяжёлых» файлов и даже удаление прямо из интерфейса.
9 сентября 20254 мин

fio: как правильно тестировать скорость дисков
Практическое руководство по тестированию дисков через fio: команды, параметры, профили нагрузки и разбор результатов.
29 октября 20269 мин
Настроить мониторинг за 30 секунд
Надёжные уведомления о даунтаймах. Без ложных срабатываний