Краткий ответ
Высокая загрузка CPU и load average в Linux чаще всего вызваны одним процессом, который потребляет слишком много ресурсов из-за ошибки в приложении, неправильной конфигурации или внешней атаки. Используйте `top`, `htop` и `ps`, чтобы найти процесс, проверьте, является ли он легитимным сервисом, а затем оптимизируйте, ограничьте или перезапустите его. Если проблема повторяется, проанализируйте логи и конфигурацию.
Как проявляется проблема
- Сервер медленно отвечает, команды SSH выполняются с задержкой
- Load average постоянно превышает количество ядер CPU
- Веб-сайт или приложение работают медленно
- Вентиляторы компьютера работают на полной скорости
- Мониторинг отправляет оповещения о высокой загрузке CPU
Частые причины
Процесс, потребляющий слишком много CPU
Приложение, база данных или скрипт могут зациклиться или иметь ошибку, из-за которой загружают одно ядро на 100%. Это наиболее частая причина высокой нагрузки.
Неправильно настроенный сервис
Nginx, MySQL, PHP-FPM или другой сервис может быть настроен неверно, создавая слишком много рабочих процессов или запросов. Проверьте конфигурацию и количество процессов.
Внешняя атака или боты
Атака или агрессивная индексация могут генерировать большое количество запросов и нагружать CPU. Проверьте логи доступа и защитите сервис.
Нехватка памяти (swap)
Когда заканчивается RAM, система начинает использовать swap, что резко увеличивает нагрузку и замедляет работу. Проверьте `free -h` и `vmstat`.
Зависшие или незавершающиеся процессы
Скрипты, которые не завершаются, или процессы в длительном состоянии `D` (ожидание ввода-вывода) могут увеличивать нагрузку. Зомби-процессы сами по себе не потребляют CPU, но могут указывать на проблему с родительским процессом. Просмотрите список процессов и их состояния.
Пошаговое решение
- 1
Проверьте текущую нагрузку
Запустите
uptime, чтобы увидеть load average за 1, 5 и 15 минут. Сравните значения с количеством ядер CPU (nproc). Если load больше количества ядер, система может быть перегружена, особенно если CPU загружен почти на 100%. - 2
Определите процесс, потребляющий CPU
Запустите
topи нажмитеP, чтобы отсортировать по потреблению CPU. Обратите внимание на столбцы%CPUиCOMMAND. Для более удобного просмотра установитеhtop(sudo apt install htopилиsudo dnf install htop) и запустите его. - 3
Просмотрите все процессы и их детали
Используйте
ps aux --sort=-%cpu | head -n 10, чтобы увидеть топ-10 процессов по CPU. Для деталей о конкретном процессе (PID) используйтеps -p PID -o pid,ppid,cmd,%cpu,%mem. - 4
Проверьте, легитимен ли процесс
По имени и пути процесса определите, принадлежит ли он известному сервису (например,
nginx,mysqld,php-fpm). Если не уверены, проверьте, когда процесс запущен (ps -p PID -o lstart) и кто его запустил (ps -p PID -o user). - 5
Проанализируйте логи приложения
Просмотрите логи подозрительного сервиса:
journalctl -u имя_сервиса -n 50или файлы в/var/log/. Ищите ошибки, повторяющиеся сообщения или неожиданные запросы. - 6
Проверьте память и swap
Запустите
free -hиvmstat 1 5. Если столбцыsi/soувеличиваются (активный swap), нехватка RAM может быть причиной высокой нагрузки. Рассмотрите добавление памяти или уменьшение количества процессов. - 7
Остановите или перезапустите проблемный сервис
Если вы определили сервис, перезапустите его:
sudo systemctl restart имя_сервиса. Если процесс неизвестен и подозрителен, сначала попробуйте остановить его безопасным способом:sudo systemctl stop имя_сервисаилиsudo kill -15 PID. Опциюsudo kill -9 PIDиспользуйте только в крайнем случае, так как это может привести к потере или повреждению данных. Если сервис записывает данные или использует базу данных, перед вмешательством сделайте резервную копию. - 8
Ограничьте ресурсы для сервиса
Для сервисов под systemd можно установить ограничения в unit-файле (например,
CPUQuota=50%). После изменения unit-файла выполнитеsudo systemctl daemon-reloadи перезапустите сервис. Для PHP-FPM настройтеpm.max_children, а для базы данныхmax_connections. Обратитесь к документации для точных параметров. - 9
Проверьте, не является ли это атакой
Просмотрите логи доступа веб-сервера (
/var/log/nginx/access.logили аналогичные) и поищите большое количество запросов с одного IP-адреса. При необходимости заблокируйте IP через firewall (sudo ufw deny from IP) или настройте rate limiting.
Если ничего не помогает: углубленный анализ
Если высокая нагрузка повторяется и вы не можете связать ее ни с одним процессом, используйте продвинутые инструменты. pidstat -u 1 показывает потребление CPU по процессам в реальном времени (если установлен пакет sysstat). sudo iotop показывает дисковый ввод-вывод, а vmstat 1 дает обзор системных ресурсов. Для детального анализа CPU используйте perf top (если установлен) или strace -p PID, чтобы увидеть системные вызовы процесса; strace может замедлить процесс, поэтому используйте его кратковременно. Также проверьте, не является ли это аппаратной проблемой (например, перегревом) с помощью sensors или dmesg | grep -i error. Если подозреваете компрометацию, запустите от имени root rkhunter или chkrootkit и просмотрите задания cron: crontab -l показывает только задания текущего пользователя, а от имени root можно использовать sudo crontab -l -u пользователь или просмотреть /etc/crontab, /etc/cron.* и /var/spool/cron.
Как избежать повторения
- Регулярно обновляйте программное обеспечение и следите за исправлениями безопасности
- Настройте мониторинг (например, `monit`, `netdata`) и оповещения о высокой нагрузке
- Настройте лимиты ресурсов для сервисов (systemd, PHP-FPM, база данных)
- Просматривайте логи и анализируйте тенденции нагрузки
Когда лучше обратиться к специалисту
Если вы не можете определить процесс, подозреваете компрометацию или требуется изменение конфигурации критических сервисов, обратитесь к IT-специалисту. Они смогут быстро изолировать причину и предотвратить длительные простои.
Обслуживание ИТ-инфраструктуры · Серверы, сети, резервное копирование, безопасность и helpdeskЧастые вопросы
Что означает load average и какое значение приемлемо?
Load average показывает среднее количество процессов, ожидающих CPU или ввода-вывода, за последние 1, 5 и 15 минут. Как грубое правило, приемлемо, чтобы оно было меньше или равно количеству ядер CPU. Если оно постоянно больше, система может быть перегружена.
Как временно снизить нагрузку без перезагрузки сервера?
Вы можете остановить или перезапустить проблемный сервис, временно ограничить квоту CPU для процесса (например, `cpulimit`) или отключить ненужные сервисы, если уверены, что они не нужны. Для быстрого вмешательства используйте `sudo kill -15 PID` для процесса, который потребляет больше всего; `sudo kill -9 PID` используйте только в крайнем случае и не на производственных базах данных без предварительной резервной копии.
Всегда ли высокая нагрузка связана с проблемой CPU?
Нет. Высокая нагрузка может быть следствием медленного диска (I/O wait), нехватки памяти (swap) или большого количества процессов в незавершенном состоянии. Поэтому проверьте `vmstat`, `iostat` и `free -h`, прежде чем делать вывод, что виноват CPU.