Недавно у меня возникла странная проблема с моим веб-сервером. За последний день или около того сайт, кажется, несколько замедляется через случайные промежутки времени, мы, кажется, не испытываем какого-либо значительного дополнительного трафика, однако беглый взгляд на «верхнюю часть» и 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
Итак, у меня двоякий вопрос:
Создайте простой исполняемый файл:
#!/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.