Когда сервер тормозит, первое, что нужно понять: чего не хватает - процессора, памяти, диска или сети, и какой процесс в этом виноват. Для этого в Linux есть набор консольных утилит. Большинство из них уже установлены, а iostat, sar и mpstat входят в пакет sysstat:

bash
sudo apt install sysstat htop   # Debian, Ubuntu
sudo dnf install sysstat htop   # Fedora, RHEL и родственные

uptime и w: средняя нагрузка

Три столбца разной высоты с циферблатами под ними

bash
uptime
text
 10:15:32 up 12 days,  3:41,  2 users,  load average: 0.85, 1.20, 1.05

Три числа load average - средняя нагрузка за 1, 5 и 15 минут. Это среднее число процессов, которые выполняются или ждут процессора, а также ждут диска в непрерываемом сне. Сравнивайте его с числом ядер (nproc): на 4-ядерном сервере нагрузка около 4 означает полную занятость, заметно выше - очередь. Если первое число больше третьего, нагрузка растёт, если меньше - спадает.

w показывает ту же строку и список вошедших пользователей: откуда подключены, сколько бездействуют и что запустили.

top

bash
top

Вверху - сводка: нагрузка, число задач, загрузка процессора, память. Ниже - процессы, по умолчанию отсортированные по загрузке процессора.

Строка процессора (%Cpu(s)):

  • us - пользовательские программы, sy - ядро, ni - процессы с пониженным приоритетом;
  • id - простой;
  • wa - ожидание ввода-вывода. Высокое значение - процессор свободен, но ждёт диска;
  • hi, si - обработка прерываний;
  • st - время, отнятое гипервизором. На виртуальной машине высокое значение означает, что физическому серверу не хватает процессора для всех машин.

Столбцы процессов: PID, USER, PR и NI (приоритет), VIRT (виртуальная память), RES (реально занятая физическая память), SHR (разделяемая), S (состояние: R - выполняется, S - спит, D - ждёт ввода-вывода, Z - зомби), %CPU, %MEM, TIME+, COMMAND.

Клавиши внутри top:

  • P - сортировать по процессору, M - по памяти, T - по времени работы;
  • 1 - показать каждое ядро отдельно;
  • c - полная командная строка процессов;
  • k - завершить процесс (спросит PID и сигнал);
  • r - изменить приоритет (nice);
  • u - показать процессы одного пользователя;
  • q - выйти.

Однократный снимок для скрипта или отчёта: top -b -n 1 | head -20.

htop

htop - удобный вариант top: цветные шкалы загрузки каждого ядра и памяти, прокрутка, поиск (F3), фильтр (F4), дерево процессов (F5), сортировка выбором столбца (F6), завершение процесса (F9) и изменение приоритета (F7, F8) без ввода PID. Для интерактивной работы обычно удобнее, чем top.

ps

ps выводит снимок процессов, и его удобно комбинировать с другими командами.

bash
ps aux                                 # все процессы, BSD-формат
ps -ef                                 # все процессы, формат с PPID
ps aux --sort=-%mem | head             # самые прожорливые по памяти
ps aux --sort=-%cpu | head             # по процессору
ps -o pid,ppid,user,%cpu,%mem,etime,cmd -p 1234  # выбранные столбцы для процесса
ps -ejH                                # дерево процессов
pgrep -a nginx                         # найти процессы по имени

В ps aux столбец VSZ - виртуальная память, RSS - физическая (в килобайтах), STAT - состояние, START и TIME - когда запущен и сколько процессорного времени израсходовал. Процент процессора в ps - среднее за всё время жизни процесса, а не текущая нагрузка, как в top.

free: память

bash
free -h
text
               total      # used        free      shared  buff/cache   available
Mem:            <всего>     <занято>    <свободно>  ...     <кэш>        <доступно>
Swap:           <всего>     <занято>    <свободно>

Главный столбец - available: сколько памяти можно отдать программам без использования подкачки. Маленькое значение free само по себе не проблема: Linux занимает свободную память под кэш файлов (buff/cache) и отдаёт её по первому требованию. Тревожный признак - малое available и растущее использование Swap.

vmstat

bash
vmstat 2 5

Пять строк с интервалом 2 секунды. Первая строка - средние значения с момента загрузки, смотрите на следующие.

  • r - процессы, ожидающие процессора. Постоянно больше числа ядер - не хватает процессора;
  • b - процессы, ожидающие ввода-вывода;
  • swpd, free, buff, cache - память в килобайтах;
  • si, so - чтение из подкачки и запись в неё. Ненулевые значения постоянно - нехватка памяти;
  • bi, bo - чтение с дисков и запись на диски в блоках;
  • in, cs - прерывания и переключения контекста в секунду;
  • us, sy, id, wa, st - то же, что в top.

iostat: диски

Жёсткий диск, слева и справа потоки данных и индикатор

bash
iostat -x 2

Расширенная статистика по каждому диску каждые 2 секунды. Основные столбцы:

  • r/s, w/s - операций чтения и записи в секунду;
  • rkB/s, wkB/s - объём чтения и записи;
  • r_await, w_await - среднее время выполнения запроса в миллисекундах, включая ожидание в очереди. Рост этих значений - главный признак, что диск не справляется;
  • aqu-sz - средняя длина очереди;
  • %util - доля времени, когда устройство было занято. Для одиночного жёсткого диска значения около 100% означают предел. У SSD и массивов, которые выполняют много запросов параллельно, %util может быть высоким при запасе производительности, поэтому ориентируйтесь на await.

Какой процесс нагружает диск, покажут iotop (нужны права root) или pidstat -d 2 из того же пакета sysstat.

mpstat: процессоры по отдельности

bash
mpstat -P ALL 2

Загрузка каждого ядра. Если одно ядро загружено полностью, а остальные простаивают, приложение не умеет работать параллельно или упирается в один поток, и добавление ядер не поможет. Высокий %soft на одном ядре часто связан с обработкой сетевого трафика.

sar: история нагрузки

Все утилиты выше показывают «здесь и сейчас». sar хранит историю, и с ним можно выяснить, что происходило ночью, когда сервер «тормозил».

Сбор данных нужно включить. В Debian и Ubuntu - в файле /etc/default/sysstat установите ENABLED="true", затем:

bash
sudo systemctl enable --now sysstat

В RHEL и родственных сбор включается тем же systemctl enable --now sysstat. Данные пишутся каждые 10 минут в /var/log/sysstat/ (Debian, Ubuntu) или /var/log/sa/ (RHEL).

Просмотр:

bash
sar -u                     # процессор за сегодня
sar -r                     # память
sar -b                     # ввод-вывод
sar -d                     # по дискам
sar -n DEV                 # сеть по интерфейсам
sar -q                     # очередь и средняя нагрузка
sar -u -s 02:00:00 -e 04:00:00        # за интервал времени
sar -u -f /var/log/sysstat/sa15       # за 15-е число месяца
sar -u 2 5                 # в реальном времени, как vmstat

pmap: память процесса

bash
pmap -x 1234

Показывает, из чего состоит память процесса: исполняемый файл, библиотеки, куча, стек, отображённые файлы. Столбец RSS - физическая память каждой области, Dirty - изменённые страницы. Итог внизу показывает общий объём. Полезно, когда процесс разрастается и нужно понять, растёт ли куча (вероятная утечка памяти) или подгружаются файлы.

С чего начать, если сервер тормозит

  1. uptime - есть ли вообще нагрузка и растёт ли она.
  2. top или htop - какой процесс занимает процессор или память, нет ли высокого wa.
  3. free -h и vmstat 2 - не уходит ли система в подкачку.
  4. iostat -x 2 - не упирается ли в диск.
  5. sar за нужный период - если проблема была в прошлом.
  6. ss -s и ss -tanp - если подозрение на сеть: сколько соединений и чьи они.

Для постоянного наблюдения за несколькими серверами с графиками и оповещениями используют системы мониторинга, но эти утилиты остаются основным инструментом, когда нужно разобраться прямо на месте.