Почему мониторинг производительности — ваша ежедневная практика
Замедление ответа веб-сервисов, рост времени обработки запросов в базе данных, внезапные ошибки 5xx или постоянные жалобы пользователей на «лаги» — все это симптомы одной проблемы: узкого места (bottleneck) в вашей IT-инфраструктуре. За каждым таким симптомом стоят конкретные цифры: загрузка процессора под 100%, активное использование свопа, очередь запросов к диску или переполнение сетевых буферов.
Мониторинг производительности — это не просто сбор данных, а инструмент для принятия оперативных решений. Он отвечает на ключевые вопросы: что именно тормозит, почему это происходит прямо сейчас и какие меры нужно принять — оптимизировать конфигурацию, масштабировать ресурсы или перераспределить нагрузку. В этой статье мы предоставляем четкий алгоритм и набор инструментов командной строки, которые позволят вам за 5-10 минут диагностировать причину проблемы и определить путь ее решения, экономя часы на поисках.
Ключевые метрики операционной системы: что измерять и как понимать
Эффективный мониторинг начинается с понимания, какие показатели существуют и что они означают. Все ключевые метрики можно разделить на четыре категории: процессор (CPU), память (RAM), дисковая подсистема (I/O) и сеть. Ниже — структурированный справочник по основным показателям, их интерпретации и пороговым значениям, сигнализирующим о проблеме.
CPU: нагрузка на процессор и ее составляющие
Метрики CPU часто путают, но каждая из них указывает на разные аспекты работы системы.
- %user: Процент времени, которое CPU тратит на выполнение кода пользовательских приложений. Высокое значение (например, >70% в течение длительного времени) указывает на высокую нагрузку от вашего сервиса или приложения.
- %system: Процент времени на выполнение кода ядра ОС (системные вызовы). Рост этого значения может говорить о проблемах с драйверами, частым переключением контекста или активной работой с сетью/диском на низком уровне.
- %idle: Процент времени простоя процессора. В здоровой системе под нагрузкой это значение может быть низким, но не должно постоянно находиться на нуле.
- %wa (iowait): Критически важная метрика. Показывает процент времени, когда CPU простаивал в ожидании завершения операций ввода-вывода (I/O). Значение выше 5-10% часто является прямым указанием на проблемы с дисковой подсистемой (медленные диски, перегруженный RAID).
- Load Average (1, 5, 15 мин): Среднее количество процессов, находящихся в состоянии исполнения или ожидания CPU (в очереди исполнения). Ключевое правило: если Load Average стабильно превышает количество доступных физических или логических ядер CPU — система перегружена, и процессы вынуждены ждать.
Память (RAM): использование, свопинг и давление
Свободная оперативная память (free memory) — не всегда хороший показатель. Современные ОС активно используют свободную память для кэширования дисковых операций.
- available: Это ключевая метрика. Она показывает объем памяти, доступный для запуска новых приложений без необходимости вытеснения кэша или использования свопа. Именно на нее нужно ориентироваться в первую очередь.
- swap used: Объем используемой области подкачки на диске. Активное чтение/запись в своп (показатели si/so в top) при достаточном объеме available памяти — верный признак проблемы, часто указывающий на утечку памяти (memory leak) в приложении.
- memory pressure: В новых версиях Linux (ядро 4.20+) появились метрики давления памяти в
/proc/pressure/memory. Они показывают, как часто процессы вынуждены ждать освобождения памяти. Рост этих значений — ранний сигнал о надвигающемся дефиците RAM.
Дисковая подсистема (I/O): скорость, очередь и задержки
Проблемы с дисками определяются не процентом использования пространства, а задержками и длиной очереди запросов.
- %util: Процент загрузки устройства. Показывает, какую часть времени устройство было занято обработкой запросов. Значение, близкое к 100%, почти всегда указывает на узкое место.
- r/s, w/s (IOPS): Количество операций чтения и записи в секунду. Показывает интенсивность нагрузки.
- rkB/s, wkB/s: Скорость чтения и записи в килобайтах в секунду. Полезно для оценки пропускной способности.
- avgqu-sz: Средняя длина очереди запросов к устройству. Значение больше 1-2 указывает на то, что запросы начинают накапливаться и ждать.
- await: Среднее время (в миллисекундах), которое запрос проводит в очереди и на обслуживании устройством. Это главный показатель задержки.
Критические пороги:- Для SSD: await > 10-20 ms — повод для детального анализа.
- Для HDD: await > 50-100 ms — вероятная проблема с производительностью.
Высокий %util при низких значениях IOPS (например, 100% util и 50 r/s) часто означает, что устройство тратит основное время не на полезную работу, а на ожидание (например, из-за механического поиска на HDD), что выражается в высоком await.
Сеть: трафик, ошибки и состояние соединений
Сетевые проблемы часто проявляются в потере пакетов или аномальном количестве соединений.
- RX/TX bytes/packets, errors, drops: Статистика сетевого интерфейса. Рост ошибок (errors) или сбросов пакетов (drops) больше нуля — прямой сигнал о проблемах с сетевым оборудованием, переполнением буферов или неверными настройками драйвера.
- Состояния соединений (ESTABLISHED, LISTEN, TIME_WAIT): Анализируются через
netstatилиss.- Большое количество соединений в состоянии TIME_WAIT (например, тысячи) может указывать на то, что приложение слишком быстро открывает и закрывает соединения, не дожидаясь корректного завершения по TCP. Это может исчерпывать лимиты ядра на доступные порты.
- Необычно высокое число ESTABLISHED-соединений к одному порту может быть признаком DDoS-атаки или ошибки в логике работы приложения (например, не закрывающиеся keep-alive соединения).
Инструменты командной строки: ваш набор для оперативной диагностики
Когда проблема возникает здесь и сейчас, системы вроде Prometheus могут не успеть помочь. На первое место выходят CLI-инструменты, дающие моментальный снимок состояния системы.
top и htop: общая картина нагрузки в реальном времени
Команда top — это отправная точка любой диагностики. Она показывает сводку по системе и список процессов.
Ключевые строки в выводе top:
- Первая строка: load average за 1, 5 и 15 минут.
- Строка %Cpu(s): детализация загрузки (us, sy, id, wa, st).
- Строка MiB Mem / Swap: использование оперативной памяти и свопа.
Практический совет: Запускайте top, а затем нажмите цифру 1, чтобы увидеть загрузку по каждому ядру CPU отдельно. Это помогает выявить проблему с одним ядром, которая может теряться в общей статистике.
htop — это улучшенная, цветная версия top. Она предоставляет те же данные, но в более наглядном виде: вертикальные шкалы загрузки CPU, дерево процессов (tree view), удобную сортировку по любому столбцу. Для ежедневного использования htop часто предпочтительнее. Запустите его командой htop.
Для наблюдения за динамикой запускайте эти инструменты с небольшим интервалом обновления: top -d 2 (обновление каждые 2 секунды).
iostat: детальный анализ дисковой активности и задержек
Когда top показывает высокий %wa, самое время запустить iostat. Эта утилита специализируется на диагностике проблем ввода-вывода.
Рекомендуемая команда для запуска: iostat -xz 2
-x: Показывает расширенную статистику, включая await, avgqu-sz и %util.-z: Пропускает вывод для неактивных устройств.2: Интервал обновления в секундах.
Пример вывода и интерпретация:
Device r/s w/s rkB/s wkB/s avgqu-sz await %util
sda 25.50 0.00 1020.00 0.00 0.85 33.44 85.30
В этом примере для диска sda мы видим: • Умеренные IOPS (25.5 чтений в секунду). • Высокий %util (85.3%) и высокий await (33.44 мс). • Это классическая картина «медленного диска»: даже при небольшой нагрузке запросы долго ждут своей очереди и выполнения, что и приводит к высокой загрузке устройства.
netstat и ss: состояние сети и открытых соединений
Для анализа сетевой активности традиционно использовался netstat, но в современных дистрибутивах его вытесняет более быстрый и функциональный инструмент ss (socket statistics).
Анализ всех TCP-соединений:
- Устаревший способ:
netstat -tnap - Современный и быстрый способ:
ss -tnap
Флаги: -t (TCP), -n (числовые адреса, без DNS), -a (все), -p (показать процесс).
Как анализировать вывод:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.1.10:22 192.168.1.100:54322 users:(("sshd",pid=1234,fd=3))
TIME-WAIT 0 0 192.168.1.10:80 10.0.0.5:45010 users:(("nginx",pid=5678,fd=15))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=4))
Сгруппируйте вывод по состоянию, чтобы быстро оценить масштаб: ss -tnap | grep -oP '^\w+' | sort | uniq -c | sort -rn. Это покажет, каких состояний больше всего. Например, тысячи TIME-WAIT потребуют проверки настроек net.ipv4.tcp_tw_reuse и net.ipv4.tcp_fin_timeout в ядре.
Для глубокой диагностики сетевых проблем, таких как обрыв маршрутизации или высокий джиттер, обратитесь к нашему практическому руководству по диагностике сетевой маршрутизации с traceroute и mtr.
Алгоритм диагностики: как найти узкое место за 5 минут
Соберем все метрики и инструменты в единый пошаговый алгоритм действий при поступлении жалобы на низкую производительность.
- Шаг 1: Общая картина. Запустите
topилиhtop. Сразу смотрите на три вещи:- Load Average: сравните с числом ядер CPU.
- Строка %Cpu(s): какая загрузка преобладает (us, sy, wa)?
- Строка памяти: низкий ли показатель available? Есть ли активность si/so (своп)?
- Шаг 2: Детализация по выявленному направлению.
- Если высокий %us/%sy: В том же
topотсортируйте процессы по %CPU (клавишаP). Определите, какой процесс потребляет ресурсы. Это приложение, база данных, скрипт? - Если высокий %wa или подозрение на диск: В отдельном терминале запустите
iostat -xz 2. Ищите высокие значения await и %util. - Если проблема с памятью (низкий available, активный swap): В
topотсортируйте процессы по %MEM (клавишаM). Выполнитеfree -hдля точного объема swap used. - Если подозрение на сеть: Запустите
ss -tnapи проверьте, нет ли аномального количества соединений в каком-либо состоянии. Проверьте статистику интерфейса командойip -s link show eth0(замените eth0 на ваш интерфейс).
- Если высокий %us/%sy: В том же
- Шаг 3: Принятие первоочередных мер. В зависимости от найденного узкого места:
- CPU: Оптимизация кода/запросов, ограничение ресурсов (cgroups), вертикальное (более мощный CPU) или горизонтальное (больше серверов) масштабирование.
- Память: Увеличение физической RAM, оптимизация настроек кэша приложения (например, для СУБД), поиск и устранение утечек памяти.
- Диск: Переход с HDD на SSD, оптимизация RAID-массива, проверка корректности работы файловой системы (например, для ZFS), настройка параметров монтирования (noatime).
- Сеть: Настройка сетевых параметров ядра (буферы, TCP-окна), проверка и обновление драйверов, настройка балансировки нагрузки.
Сценарий 1: Высокая загрузка CPU и медленный ответ сервиса
Симптомы: Веб-страницы грузятся минутами, API отвечает с таймаутами. Load Average = 8.0 на сервере с 4 ядрами.
Диагностика:
1. top показывает %us = 95%, %wa = 1%.
2. Сортировка по %CPU выявляет процесс php-fpm, потребляющий 70% CPU.
3. Команда ps auxf | grep php-fpm показывает множество дочерних процессов.
Возможные причины и действия: Неоптимизированный PHP-код (например, тяжелые циклы в скрипте), отсутствие кэширования запросов к БД. Первоочередные меры: анализ slow query log базы данных, включение OPcache для PHP, проверка нагрузки на backend. Для долгосрочного решения — профилирование кода и горизонтальное масштабирование пула php-fpm workers.
Сценарий 2: Активное использование swap и падение производительности
Симптомы: Сервер «подвисает», операции с диском происходят крайне медленно. Пользователи сообщают о полной недоступности.
Диагностика:
1. top показывает available memory ~ 50 MiB, swap used = 4.0G, активные значения si/so > 100.
2. Сортировка по %MEM показывает процесс Java-приложения, занимающий 12G RES при 16G общей памяти.
Возможные причины и действия: Недостаточно выделено памяти для Java Heap (Xmx), либо происходит утечка памяти (memory leak). Первоочередные меры: перезапуск проблемного приложения с увеличенным значением Xmx, анализ дампов памяти. Для долгосрочного решения — увеличение физической RAM на сервере, тщательная настройка параметров сборщика мусора JVM.
Если вы работаете с контейнеризованными приложениями, аналогичные принципы диагностики применимы и к Docker. В нашей полной шпаргалке по командам Docker вы найдете инструкции по мониторингу ресурсов (docker stats) и отладке контейнеров.
От оперативного мониторинга к планированию ресурсов
Данные, полученные с помощью разовых проверок top и iostat, можно и нужно использовать для стратегического планирования. Регулярный сбор ключевых метрик (например, через cron-скрипты, которые раз в минуту записывают вывод iostat и free в лог) позволяет строить графики и видеть тренды.
На что обращать внимание при анализе трендов:
- Постепенный рост Load Average при стабильном количестве пользователей может указывать на «раздувание» кода или неэффективность новых функций.
- Увеличение среднего await диска со временем — сигнал о том, что дисковое хранилище приближается к пределу своих возможностей и скоро потребует апгрейда (например, переход на NVMe).
- Медленный, но неуклонный рост потребления памяти приложениями может предшествовать внезапному исчерпанию RAM и активному свопингу.
Эти данные становятся основанием для обоснования бюджета на IT-инфраструктуру: необходимость покупки более мощного сервера, добавления узлов в кластер или перехода на более производительное сетевое или дисковое оборудование. Для автоматизации такого долгосрочного мониторинга используются специализированные системы, такие как Prometheus с экспортерами node_exporter и Grafana для визуализации, которые логически продолжают принципы, изложенные в этой статье.
Важные предостережения и проверка на актуальность
Информация и команды в этой статье проверены на практике и актуальны для большинства современных дистрибутивов Linux (RHEL/CentOS 7/8, Rocky/AlmaLinux, Ubuntu 20.04/22.04) по состоянию на 2026 год. Однако важно учитывать следующие нюансы:
- Различия в выводе инструментов. Названия и расположение некоторых колонок в выводе
topилиiostatмогут незначительно отличаться между версиями пакетовprocpsиsysstat. Всегда обращайтесь к встроенной справке (man top,man iostat) для вашей конкретной версии. - Тестирование в безопасной среде. Перед использованием любых команд, которые могут потенциально нагрузить систему (например, нагрузочное тестирование диска), или изменением параметров ядра на основе диагностики, обязательно проверяйте их в тестовом окружении, максимально приближенном к продакшн.
- Переход на современные аналоги. По возможности используйте
ssвместоnetstatиipвместоifconfig/route. Эти инструменты из пакетаiproute2поддерживаются активнее и предоставляют больше информации.
Для получения самой детальной и точной информации всегда обращайтесь к официальной документации вашего дистрибутива и man-страницам установленных утилит. Помните, что слепая копипаста команд из интернета без понимания контекста — главный риск для стабильности production-среды. Данное руководство призвано дать вам именно это понимание и надежный алгоритм действий.