@besttechwayimo

В чем может быть причина сильного увеличения длительности ответа запросов при установке Load Balancer на 2 сервера со стаком MySQL, PHP, Nginx?

У меня есть один основной сервер со стаком PHP8.2, MySQL8, Nginx (Ubuntu 22.04, Amazon Lightsail)
Технические характеристики сервера: 2 GB RAM, 2 vCPUs, 60 GB SSD
*Пик трафика в течение 4 часов - приблизительно 2.5 реквеста в секунду. Нагрузка на ЦПУ при этом пике 30-40%

С целью понизить нагрузку на основном сервере было решено добавить второй сервер, который имеет такой же стак PHP8.2, Nginx, Ubuntu 22.04 2 GB RAM, 2 vCPUs, 60 GB SSD но обращается к основной БД через коннект по приватному IP адресу в сети серверов Амазон.

Был настроен балансировщик нагрузки Cloudflare на один эндпоинт вида api.myproject.com с двух серверов. При небольшой нагрузке на сервер все работает нормально, но при большей нагрузке (в пик трафика как описано выше*) запросы на дополнительном сервере начинают отрабатывать по 5, 15 а иногда и 50 секунд. (Хотя если просто оставить основной сервер без дополнительного средняя стабильная скорость ответа эндпоинтов 100-200мс).

До настройки балансировщика был опробован HAProxy с использованием основного сервера как мастер-сервера на котором был конфиг HAProxy - ситуация аналогичная, без каких либо изменений.

В чём может быть причина такого поведения и как это можно решить?
  • Вопрос задан
  • 122 просмотра
Решения вопроса 2
Система слишком сложна для того, чтобы можно было вот так вот взять - и ответить на ваш вопрос, не изучив её. Когда в системе хотя бы несколько компонентов, взаимодействующих между собой, это сигнал к тому, что всё нужно обвесить мониторингом.

Рекомендую вам найти слабое звено, начиная с самого конца:

1. Создайте тестовое окружение в тех же облаках, с такими же компонентами, с идентичным конфигом и воспроизведите поведение при помощи какой-нибудь утилиты, которая будет нагружать эту конфигурацию, пуляя в неё запросы с необходимой частотой.

2. Когда тестовое окружение будет так же тормозить, начните искать слабое звено. Рекомендую начать с конца.

3. Замените весь ваш прекрасный PHP код на один единственный файл index.php с Hello World. Если проблема уйдёт, значит виновата ваша программа. Чтобы найти место уже в программе, рекомендую запустить Prometheus + Grafana, установить библиотеку в ваш PHP, и писать в мониторинг длительность каждой сложной операции (длительность всего запроса, длительность запросов к базе, длительность запросов во внешние API, длительность каких-то подозрительных циклов, алгоритмов и т.д.) Так вы сможете найти точное место в программе, где происходит затуп. Это надо будет сделать и на проде после решения проблемы, чтобы вы всегда знали, что происходит с вашим проектом.

4. Если проблема не в программе, проверьте конфиг PHP. Может быть, у вас там тупо мало воркеров включено, может быть не включён OPcache и т.д. Почитайте, как правильно настраивать PHP на проде.

5. Если проблема не в этом, то... https://youtu.be/bq3HksAwb2Q?si=NsBZeYeHsq69JW6o
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Нагрузка на ЦПУ при этом пике 30-40%
это че за нагрузка при 3рпс? Профилирование нагрузки - первый шаг, балансер и горизонтальное расширение это шаг стопитьсот, когда вы упираетесь в потолок того что может вытянуть сервак. 90% что проблемы в количестве (и качестве) запросов к бд, крайне маловероятно что код у вас настолько сложный, что не вытягивает...

обращается к основной БД через коннект по приватному IP адресу в сети серверов Амазон.
Тестом запустите подряд 20-30 разных запросов с разным размером ответа, каждый замерьте, подозреваю что будете не очень приятно удивлены...

запросы на дополнительном сервере начинают отрабатывать по 5, 15 а иногда и 50 секунд.
А на основном все остается норм? В любом случае - профайлинг наше все, + под нагрузочным тестированием хоть как-то.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы