Нагрузка на сервер и старый код биржи ссылок SAPE

Нагрузка на сервер и старый код биржи ссылок SAPE

Дано: Выделенный сервер, достаточно мощный. 260 сайтов на WordPress.

Проблема: Каждые 3-4 часа нагрузка уходит «в космос», держится там около минут 30, и потом очень медленно на спад. Был переезд с другого сервера, это не помогло.

День 1

Действительно на графике в ISP5 отлично видны пики нагрузки. Начинаю изучать, пока нет нагрузки. Все WP обновлены. Посмотрел конфиги сервера, вполне всё нормально. Был обновлён PHP 7.0 до версии 7.3, также развязаны лимиты nginx и MySQL т.к. памяти у нас 64 ГБ, чего уж там экономить для 260 сайтов то.

Немного подождав, пришла волна! Apache забивается весь, а увеличение лимита клиентов, не играет роли, хоть 250 хоть 500, всё забито. HDD «горит», SSD отдельный с MySQL спит спокойно.

Начинаю анализировать, кто же долбится то в таком количестве? Ба! Так это же боты в огромном количестве, всякие переборщики паролей, спамеры в комментарии и т.д. Плюс ко всему ещё поисковые роботы хотят индексировать сайты.

Всё ясно, устраивают серверу на HDD просто ДДОС атаку. 260 сайтов на WP и все, кому не лень, сканируют их на дырки.

Решение: блокируем плохие подсети, ставим на сайты кэш систему на всякий случай и блокируем REST-API

Нагрузка начинает спадать, оставляем на сутки.

День 2

Ничего не изменилось. Опять нагрузка, возможно, график чуть изменился, но суть прежняя. Может быть остались боты? Да нет, ботов очень мало. Анализирую пакеты TCP, ничего такого нет. Но что-то сервер ожидает и не даёт клиентам информацию. Учитывая, что нагрузка спала, опять курим бамбук… Случайно выясняется, что все 260 сайтов работают под одним пользователем MySQL, ну для удобства было сделано, а в настройках лимиты выставлены 80 подключений на 1 пользователя! Всё ясно, приходят много подключений и пока они не отработают, MySQL не даст новых подключений, вот вам очередь. Увеличивая лимит Apache, мы только делаем хуже!

Решение: увеличиваем лимиты для 1 пользователя в MySQL.

Оставляем всё это на ночь.

День 3

Ничего не изменилось.

Да быть такого не может. Жду волну нагрузки и начинаю strace процессов Apache, что же они делают. Замечаю, что вызывается биржа Sape. ОУ! Действительно на всех сайтах стоит код биржи. Файл старый 2016 года, настройки там по умолчанию.

Так постойте-ка, там кэш на 1 час, запрос через обычный file_get_contents, который ожидает 60 секунд, и вся работа с 1 файлом (он же БД) идёт.

Теперь давайте представим алгоритм работы в данном случае. В какой-то момент приходят боты, юзеры и т.д. и попадают в момент, когда нужно обновить кэш SAPE. Учитывая, что все сайты на 1 IP, биржа просто перестаёт отвечать на такое количество запросов. У нас timeout 60 секунд и +10 минут к времени НЕ обновления кэша в случае timeout.

Очередь моментально вырастает, все бьются за 1 файл БД, чтобы сделать пометку на одном сайте, а в потом такая же очередь выстраивается к другому файлу на другом сайте.

Решение: берём новый файл sape.php, в нём реализовано многофайловое хранения ссылок (АГА, значит был такой баг у кого-то). Выставляем в нём кэш 12 часов и режим работы с CURL с 6 секундным timeout. Меняем на всех сайтах и ждём.

День 4

Никакой нагрузки. Всё работает штатно.

Вот такая вот история, спасибо, что дочитали.

 
Оформление заказа
Не отправляйте пароли от Вашего сайта. Дополнительные данные будут запрошены отдельно по необходимости.
Мы получили Вашу заявку!
Скоро с Вами свяжутся и мы обсудим все детали.


Обязательно проверяйте папку "Спам". Мы постараемся отвечать быстро!