Высокий LA, периодические зависания соединений
Здравствуйте.
Сервер на SSD, 64GB RAM, 12 ядер, стоит Debian 7, на сервере работают сайты в связке Apache, Nginx, PHP, MySQL, Sphinx. Долгое время уровень LA держался на уровне 25-30, подтормаживало, не супер критично, работы было много, откладывали это дело всегда в долгий ящик. Когда LA улетал до 50-70-100, перезагружали Apache или сам сервер, LA приходил к норме, работали дальше.
Полгода назад решил заняться этим вопросом. Сам я нуб в Linux, работал на уровне поставить программу по инструкции, покрутить настройки Mysql, Apache по статейкам в интернете (пальцем в небо). Начал разбираться, узнал, что такое access-логи, из них выяснил, что нас долбят огромным количеством спама, разобрался с iptables на уровне забанить IP. Написал простой скрипт, который парсил access-логи и выдавал IP, с которых было огромное количество запросов, потом банил вручную эти IP. В момент повышения нагрузки набаню 20-30 IP, перезагружу сервер, LA становится 10-12, все летает, успокаиваюсь. В течение недели плавно нарастает та же самая шляпа, нужно все повторять. Нашел информацию о сервисе fail2ban, установил, включил – изменений сразу не увидел и забыл про него. Со временем стал замечать, что нагрузка 8-10, боты вроде уже и не долбятся (очень много набанил вручную самых основных + на уровне Nginx настроил 403 ответ по куче юзер-агентов часто встречающихся ботов), но есть странные зависания при работе с сайтами – ходишь по страницам, отправляешь формы, и в какой-то момент бац – 10-15 секунд зависание запроса, который в 90% случаев выполняется, а в 10% отваливается после этого ожидания. Тут же пробуешь повторить действие несколько раз – все в порядке. Через 2-3 минуты опять такое же зависание, клиенты тоже начали на подобное жаловаться, и это поведение спустя полгода начало ухудшаться – уже и пару раз за минуту могло произойти. В этот момент вспомнил про fail2ban, установленный полгода назад и брошенный с настройками по умолчанию (там были включены фильтры для ssh и apache), попробовал его выключить – ситуация с зависаниями очень сильно сократилась, в день выключения заметил 3-5 подвисаний за весь день, что могло и по любым другим причинам произойти. Но! Начала опять расти нагрузка, стало 20-30, как и раньше, и подвисаний вроде и нет, но зато все медленно работает. Решил разобраться с fail2ban, выключил секцию apache, включил apache-badbots, написал для него собственную регулярку со списком постоянно спамящих нас юзер-агентов (за сутки более 600 IP по ним он забанил), также оставил секцию с ssh. Параллельно с этим просмотрел лог медленных запросов MySQL, поисправлял кучу запросов, добавил индексов (при высоком LA, как правило, именно mysqld жрал CPU сильнее всех по команде top), нагрузка спала аж до 3-5 в моменте, все начало летать. Спустя 2 дня опять начинаются подвисания по 10-15 секунд, LA 8-10. Выключил fail2ban, нагрузка 20-30, зато нет зависаний. Моментами спадает нагрузка, может 2 часа держаться в норме, потом опять 20-30. Перезагружаю Apache, нагрузка падает, в течение 10 минут опять вырастает.
Перерыл весь интернет, везде все разное, каждый случай, как я понял, в администрировании уникальный, какой-то конкретной методологии выявления проблем не нашел, хожу по кругу, 10 часов танцев с гуглом (бубном), удается снизить нагрузку, но через 2 дня опять подскоки, причем в час-пик может быть 8-10, а ночью 20, хотя чаще все-таки наоборот. И если с самой нагрузкой еще хоть какие-то наметки понятны, хотя далеко не все, то с зависаниями при включенном fail2ban не улавливаю вообще, ведь он конкретный входящий запрос не трогает – он сканит логи.
Моя логика такая, что из-за того, что на сервере в районе 100 сайтов, которых постоянно посещает куча разных ботов, которые, может, и не такие плохие, и нагрузку на каждый сайт создают небольшую, но если сайтов 100, то и нагрузка x100. Они дергают запросы, каждый запрос – нагрузка на mysql, которая все время «в топе» команды top. Их нужно банить автоматически, с чем справляется fail2ban, но после его включения через некоторое время начинаются какие-то зависания соединений. После его выключения, боты выходят из бана и начинают нас спамить, дергать огромное количество страниц, создавая огромное количество запросов к БД, которая начинает жрать все ресурсы CPU. А может это предположение, потому что в момент этой высокой нагрузки не понимаю, за что зацепиться – и боты, и MySQL жрет CPU, естественно лог медленных запросов растет, а нужно ли их исправлять – да вроде нет, ведь когда нагрузка в норме, лог почти не растет.
В общем хочу обратиться за помощью, с чего начать, чтобы не ходить по кругу от access-логов и fail2ban с iptables до оптимизации кода приложений? Уже умуздыкался, результат всегда один – через некоторое время после 1-2 дней танцев с бубном начинаются ухудшения производительности.