Назад | Перейти на главную страницу

Случайная высокая загрузка ЦП в Linux с использованием Apache

Недавно у меня возникла странная проблема с моим веб-сервером. За последний день или около того сайт, кажется, несколько замедляется через случайные промежутки времени, мы, кажется, не испытываем какого-либо значительного дополнительного трафика, однако беглый взгляд на «верхнюю часть» и httpd, кажется, прыгает между 3-10 % примерно до 99%, затем кратковременно достигая примерно середины 80-х годов, а затем снова снижаясь. Например:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2443 apache    25   0  256m  20m 5472 R 88.2  2.1   3:22.29 httpd

Кажется, это происходит каждые 30 минут или около того. Странно то, что в то же время, когда это происходит, я могу запустить страницу состояния сервера Apache и получить (например):

CPU Usage: u700.5 s6.22 cu0 cs0 - 20.2% CPU load

Итак, у меня двоякий вопрос:

  1. Кто-нибудь знает, почему эта проблема могла возникнуть в течение последнего дня или около того (на сервере не было никаких изменений)
  2. Почему моя статистика использования ЦП в верхней части намного выше, чем статус сервера, и что является правильным?

Создайте простой исполняемый файл:

#!/usr/bin/sh
# use IP
 netstat -na |grep ESTABLISHED
# use NAMES
# netstat -ta |grep ESTABLISHED

«Ta» распечатает имена DNS, поэтому раскомментируйте, какое из них вы предпочитаете.

Затем поместите в программу, которая запускает файлы с определенным интервалом, например crontab. Я бы прочитал справочную страницу по этому поводу, возможно, вы даже не сможете ее использовать. Вы захотите отправить вывод в журнал для использования в будущем. Вы можете добавить в скрипт команду даты, если хотите записывать время. Пример crontab:

#minute hour dayofmonth monthofyear dayofweek
0,15,30,45 * * * * <path/to/script> > <log>

Это редактируется с помощью crontab -e (снова прочтите страницу руководства).

Вы можете использовать это для сортировки самых популярных записей в вашем access.log:

awk '{print $1}' access_log | sort |uniq -c |sort -n

Если вы действительно видите медленный отклик веб-страницы, посмотрите на ожидание ввода-вывода, иногда загрузка ЦП «высокая» не имеет большого значения.

Проверьте свои журналы доступа. У вас может быть обработчик данных или поисковый робот, просматривающий каждую страницу вашего сайта, так как интервал такой регулярный.

Использование ЦП со страницы состояния сервера Apache - это среднее использование с момента запуска Apache, поэтому таких всплесков не будет. Когда вы получаете эти всплески нагрузки, вы можете проверить страницу состояния сервера, чтобы узнать, какие страницы / клиенты являются сервером (должен быть включен ExtendedStatus).

Вы также можете использовать netstat, чтобы увидеть, какие клиенты в настоящее время обращаются к вашей машине:

 netstat -an | grep ESTABLISHED

Если вы запустите это в течение нескольких часов и пики трафика, вы сможете обнаружить повторно обнаруживаемый IP-адрес и потенциально проследить до конкретного робота / краулера. Если это действительно так, вы можете изучить использование robots.txt для ограничения того, насколько хорошо роботы должны сканировать ваш сайт.

Изменить: на загруженном сервере приведенная выше команда netstat должна отображать некоторые записи, например:

tcp        0      0 10.2.212.13:80              216.146.52.21:24979         ESTABLISHED
tcp        0      0 10.2.212.13:80              86.174.113.138:54901        ESTABLISHED
tcp        0      0 10.2.212.13:80              94.1.216.253:51204          ESTABLISHED
tcp        0      0 10.2.212.13:80              24.9.61.204:62936           ESTABLISHED

IP-адрес клиента будет справа. Если вы видите только 1 или 2 строки, это просто означает, что в данный момент есть только ваше ssh-соединение. Проверьте еще раз, когда ваша нагрузка возрастет. Вы также можете удалить grep, чтобы отобразить все подключения, хотя это будет включать большое количество старых TIME_WAIT.

Я бы начал с расширенного состояния сервера и посмотрел, может ли он выявить какие-либо очевидные сканеры во время пиков трафика.

Я подозреваю, что у вас четырехъядерный процессор. В этом случае вы легко можете оказаться в ситуации, когда top будет возвращать% как нагрузку на каждое ядро, тогда как другие инструменты будут делить это число на количество ядер, чтобы получить общий показатель загрузки ЦП в целом.

Что касается вариаций, то я склонен дать тот же совет, что и Hyppy.