Перейти к основному содержимому
Вернуться в категорию

Диагностика высокой загрузки CPU и RAM

Руководство по диагностике высокой загрузки CPU и RAM на серверах с помощью команд top, htop, ps, механизма OOM killer, анализа процессов и оптимизации ресурсов.

Время чтения: 15 мин Устранение неполадок
cpuramtophtoppsoom-killerпамятьпроизводительность

Содержание

Введение

Высокая загрузка CPU или RAM на сервере может привести к снижению производительности, перебоям в работе сервисов и даже к полной недоступности сервера. В этом руководстве мы подробно рассмотрим инструменты и методы для выявления ресурсоёмких процессов и решения проблемы.

Быстрая проверка состояния

Команда top

top — основной инструмент для мониторинга системных ресурсов в реальном времени:

hljs bash
top

Ключевые поля:

  • %CPU: Процент использования процессора
  • %MEM: Процент использования памяти
  • RES: Использование физической RAM
  • VIRT: Использование виртуальной памяти
  • TIME+: Общее время CPU

Полезные горячие клавиши:

  • P — Сортировка по CPU
  • M — Сортировка по памяти
  • k — Завершить процесс (ввести PID)
  • 1 — Показать каждое ядро CPU отдельно
  • c — Показать полную командную строку

Команда htop

htop — более продвинутая и удобная версия top:

hljs bash
# Установка
sudo apt install htop -y

# Запуск
htop

Преимущества htop:

  • Цветной визуальный интерфейс
  • Поддержка мыши
  • Горизонтальная и вертикальная прокрутка
  • Древовидный вид (F5)
  • Фильтрация (F4) и поиск (F3)

Однократный просмотр состояния

hljs bash
# Топ-10 процессов по CPU
ps aux --sort=-%cpu | head -11

# Топ-10 процессов по RAM
ps aux --sort=-%mem | head -11

# Процессы определённого пользователя
ps -u www-data --sort=-%cpu

# Древовидный вид процессов
ps auxf

Анализ загрузки CPU

Выявление процессов с высокой загрузкой CPU

hljs bash
# Загрузка CPU в реальном времени
mpstat -P ALL 1 5

# Загрузка CPU по процессам (интервал 5 секунд)
pidstat -u 5 3

# Загрузка CPU конкретного процесса
pidstat -p НОМЕР_PID 1

История загрузки CPU

hljs bash
# Исторические данные CPU с помощью sar
sar -u 1 10

# Загрузка CPU за последние 24 часа
sar -u -f /var/log/sysstat/sa$(date +%d)

# Проверка load average
uptime
cat /proc/loadavg

Значение load average следует сравнивать с количеством ядер CPU. На 4-ядерном сервере load average 4.0 означает 100% загрузку CPU. 8.0 означает перегрузку.

Анализ CPU-интенсивных процессов

hljs bash
# Подробная информация о процессе
ps -p НОМЕР_PID -o pid,ppid,user,%cpu,%mem,etime,cmd

# Открытые файлы процесса
lsof -p НОМЕР_PID

# Системные вызовы процесса
strace -p НОМЕР_PID -c

# Потоки процесса
ps -T -p НОМЕР_PID

Анализ использования RAM

Проверка состояния памяти

hljs bash
# Общее состояние памяти
free -h

# Подробная информация о памяти
cat /proc/meminfo

# Сводка использования памяти
vmstat 1 5

Чтение вывода free -h:

              total        used        free      shared  buff/cache   available
Mem:           16Gi       8.2Gi       1.1Gi       256Mi       6.7Gi       7.2Gi
Swap:          4.0Gi       512Mi       3.5Gi

В Linux "свободная" память может казаться малой, потому что система использует свободную память как дисковый кеш. Реально доступная память указана в столбце "available".

Выявление RAM-интенсивных процессов

hljs bash
# Сортировка по RSS (Resident Set Size)
ps aux --sort=-rss | head -11

# Детальный анализ памяти с помощью smem
sudo apt install smem -y
smem -t -k -s rss

# Использование памяти по процессам
pmap -x НОМЕР_PID

Анализ использования swap

hljs bash
# Процессы, использующие swap
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $file
done | sort -k 2 -n -r | head -10

# Мониторинг активности swap
vmstat 1 10

# Значение swappiness
cat /proc/sys/vm/swappiness

# Установка swappiness (временно)
sudo sysctl vm.swappiness=10

# Установка swappiness (постоянно)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

Механизм OOM Killer

Ядро Linux активирует OOM (Out of Memory) Killer при исчерпании памяти, завершая процесс с наибольшим потреблением памяти.

Проверка логов OOM Killer

hljs bash
# Поиск событий OOM Killer
dmesg | grep -i "oom\|out of memory"

# OOM в системных логах
journalctl -k | grep -i oom

# Последние события OOM
grep -i 'oom' /var/log/syslog

Проверка OOM Score

hljs bash
# OOM score процесса
cat /proc/НОМЕР_PID/oom_score

Защита от OOM Killer

hljs bash
# Защита критического процесса от OOM Killer
echo -1000 > /proc/НОМЕР_PID/oom_score_adj

# Защита OOM в сервисе systemd
[Service]
OOMScoreAdjust=-1000

Завершение процесса OOM Killer указывает на серьёзную проблему с памятью на сервере. Добавление защиты OOM без нахождения причины не решит проблему.

Управление процессами

Настройка приоритета процессов

hljs bash
# Запуск с nice-значением (-20 наивысший, 19 наименьший приоритет)
nice -n 10 ./долгая-задача.sh

# Изменение приоритета работающего процесса
renice -n 15 -p НОМЕР_PID

Завершение процессов

hljs bash
# Мягкое завершение (SIGTERM)
kill НОМЕР_PID

# Принудительное завершение (SIGKILL)
kill -9 НОМЕР_PID

# Завершение по имени
killall имя_процесса
pkill -f "шаблон_процесса"

Скрипт мониторинга ресурсов

hljs bash
#!/bin/bash
CPU_THRESHOLD=90
MEM_THRESHOLD=90
LOG_FILE="/var/log/resource-monitor.log"

while true; do
  TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
  CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | cut -d'.' -f1)
  if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
    echo "[$TIMESTAMP] ВНИМАНИЕ: Загрузка CPU $CPU_USAGE%" >> $LOG_FILE
    ps aux --sort=-%cpu | head -6 >> $LOG_FILE
  fi
  MEM_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100)}')
  if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
    echo "[$TIMESTAMP] ВНИМАНИЕ: Использование RAM $MEM_USAGE%" >> $LOG_FILE
    ps aux --sort=-%mem | head -6 >> $LOG_FILE
  fi
  sleep 60
done

Заключение

Высокая загрузка CPU и RAM — критические проблемы, напрямую влияющие на производительность сервера. С помощью инструментов top, htop, ps и vmstat вы можете выявить проблемные процессы, настроить приоритеты с помощью nice/renice и при необходимости завершить процессы. Регулярная проверка логов OOM Killer важна для раннего обнаружения проблем с памятью.