В данном руководстве мы рассмотрим основные причины высокой нагрузки на виртуальном сервере и их устранение.
К примеру при открытие сайта, размещенного на сервере наблюдаются сильные задержки, меделенное выполнение команд в консоли.
1. Проверим нагрузку
Например, при наличие 6 ядер CPU максимальная нагрузка LA (Load Average) будет ровна 6. (1 это 100% от ядра).
В нашем примере для проверки данных показателей мы используем команду
top
На скриншоте мы видим, что данный показатель значительно превышен, что говорит об очень высокой нагрузке на виртуальную машину.
Таким образом причина медленной работы сервера является существенное превышение нагрузки. В нашем примере мы видим также процессы, которые создают эту нагрузку, они имеют статус (R) - (Run - активные процессы).
В пункте COMMAND мы видим саму команду, которая забирает максимальное количество ресурсов. В нашем примере это php скрипты.
Также обратите внимание на параметр Tasks, он показывает количество процессов на виртуальной машине - 752, из них 40 процессов в активном состоянии.
В качестве примера штатной работы сайта с посещаемостью 700 уникальных посетителей в сутки и порядка 21000 посетителей в месяц, при схожей конфигурации сервера его нагрузка составляет: LA - 0,41, Tasks - 51 (2 running).
Более или менее очевидно, что сервер подвергается флуду или dos атаке, возможно также исполнение скриптов с целью рассылки спама или выставление сервера в роли атакующего какой-либо ресурс (использованием его как прокси злоумышленниками).
2. Решение
Зачастую эффективно работать в консоли при высокой нагрузке сложно. Так как в нашем случае это веб службы. Остановим их:
service nginx stop
service apache2 stop
В некоторых случаях данные команды могут долго выполняться, тогда лучше завершить процесс принудительно.
Посмотрите pid активных процессов и завершите их и использованием команды (где pid - это id процесса):
kill -9 pid
Если команда top долго запускается или подтормаживает, используйте ps aux и фильтром по имени процесса:
ps aux | grep nginx
После завершения данных процессов нагрузка должна прийти в норму, тогда можно просмотреть access log файл на наличие одинаковых запросов и узнать путь к скрипту. Например, командой tail и использованием фильтра grep.
tail -f /var/log/nginx /access.log
Обратите внимание! У Вас может быть другой путь в log файлу и его имя.
Далее удалите вредоносные скрипты, у них также будет отличаться дата создания в отличие от основных файлов. Это видно при использовании файлового менеджера mc.
2.1 Альтернативный поиск скрипта, создающего высокую нагрузку
Если сервер отвечает на Ваши команды с небольшой задержкой (терпимой) - можно узнать имя файла скрипта, используя команду (где pid - id php процесса):
lsof -p pid
Удалите вредоносные файлы, после чего нагрузка на сервер будет снижаться.
Наличие вредоностных файлов не обязательно, в случае dos или ddos атак. В данном случае Вам потребуется установить защиту, подробнее мы описывали тут: Защита веб сервера от Flood атак
Данный пример больше вероятен если на сервере используются популярные CMS и давно не обновлялись.