Диагностика высокой загрузки CPU и RAM
Руководство по диагностике высокой загрузки CPU и RAM на серверах с помощью команд top, htop, ps, механизма OOM killer, анализа процессов и оптимизации ресурсов.
Содержание
Введение
Высокая загрузка CPU или RAM на сервере может привести к снижению производительности, перебоям в работе сервисов и даже к полной недоступности сервера. В этом руководстве мы подробно рассмотрим инструменты и методы для выявления ресурсоёмких процессов и решения проблемы.
Быстрая проверка состояния
Команда top
top — основной инструмент для мониторинга системных ресурсов в реальном времени:
top
Ключевые поля:
- %CPU: Процент использования процессора
- %MEM: Процент использования памяти
- RES: Использование физической RAM
- VIRT: Использование виртуальной памяти
- TIME+: Общее время CPU
Полезные горячие клавиши:
P— Сортировка по CPUM— Сортировка по памятиk— Завершить процесс (ввести PID)1— Показать каждое ядро CPU отдельноc— Показать полную командную строку
Команда htop
htop — более продвинутая и удобная версия top:
# Установка
sudo apt install htop -y
# Запуск
htop
Преимущества htop:
- Цветной визуальный интерфейс
- Поддержка мыши
- Горизонтальная и вертикальная прокрутка
- Древовидный вид (F5)
- Фильтрация (F4) и поиск (F3)
Однократный просмотр состояния
# Топ-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
# Загрузка CPU в реальном времени
mpstat -P ALL 1 5
# Загрузка CPU по процессам (интервал 5 секунд)
pidstat -u 5 3
# Загрузка CPU конкретного процесса
pidstat -p НОМЕР_PID 1
История загрузки CPU
# Исторические данные 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-интенсивных процессов
# Подробная информация о процессе
ps -p НОМЕР_PID -o pid,ppid,user,%cpu,%mem,etime,cmd
# Открытые файлы процесса
lsof -p НОМЕР_PID
# Системные вызовы процесса
strace -p НОМЕР_PID -c
# Потоки процесса
ps -T -p НОМЕР_PID
Анализ использования RAM
Проверка состояния памяти
# Общее состояние памяти
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-интенсивных процессов
# Сортировка по 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
# Процессы, использующие 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
# Поиск событий OOM Killer
dmesg | grep -i "oom\|out of memory"
# OOM в системных логах
journalctl -k | grep -i oom
# Последние события OOM
grep -i 'oom' /var/log/syslog
Проверка OOM Score
# OOM score процесса
cat /proc/НОМЕР_PID/oom_score
Защита от OOM Killer
# Защита критического процесса от OOM Killer
echo -1000 > /proc/НОМЕР_PID/oom_score_adj
# Защита OOM в сервисе systemd
[Service]
OOMScoreAdjust=-1000
Завершение процесса OOM Killer указывает на серьёзную проблему с памятью на сервере. Добавление защиты OOM без нахождения причины не решит проблему.
Управление процессами
Настройка приоритета процессов
# Запуск с nice-значением (-20 наивысший, 19 наименьший приоритет)
nice -n 10 ./долгая-задача.sh
# Изменение приоритета работающего процесса
renice -n 15 -p НОМЕР_PID
Завершение процессов
# Мягкое завершение (SIGTERM)
kill НОМЕР_PID
# Принудительное завершение (SIGKILL)
kill -9 НОМЕР_PID
# Завершение по имени
killall имя_процесса
pkill -f "шаблон_процесса"
Скрипт мониторинга ресурсов
#!/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 важна для раннего обнаружения проблем с памятью.
Связанные статьи
Проблема SSH-подключения: не могу подключиться к серверу
Руководство по решению проблем SSH-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для SSH-порта и шаги по устранению неполадок.
Проблема RDP-подключения: не могу подключиться к Windows Server
Руководство по решению проблем RDP-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для порта RDP и шаги по устранению неполадок.
Как провести MTR-тест и отправить результаты в поддержку
Руководство по сетевому тестированию с помощью WinMTR и Linux MTR, создание правила фильтрации ICMP и отправка результатов в службу поддержки. Диагностика потери пакетов.