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

У меня есть основной сервер, работающий на стеке PHP 8.2, MySQL 8 и Nginx, с установленной операционной системой Ubuntu 22.04 на Amazon Lightsail. Его технические характеристики: 2 ГБ ОЗУ, 2 vCPU, 60 ГБ SSD. 

Пик трафика за четыре часа составляет примерно 2,5 запроса в секунду, при этом нагрузка на ЦПУ достигает 30-40%.

Чтобы снизить нагрузку на основной сервер, я добавил второй сервер с аналогичными характеристиками и стеком технологий PHP 8.2, Nginx, Ubuntu 22.04, который подключается к основной базе данных через приватный IP-адрес в сети Amazon.

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

Перед настройкой балансировщика я опробовал HAProxy, установив его на основном сервере в роли мастер-сервера, но возникла аналогичная проблема без каких-либо изменений.

Какова может быть причина такого поведения, и какие шаги можно предпринять для решения этой проблемы?
  • 14 октября 2024 г. 12:13
Ответы на вопрос 2
Проблемы с производительностью в сценарии добавления балансировщика нагрузки могут быть вызваны рядом факторов. Давайте рассмотрим некоторые из возможных причин и действия, которые можно предпринять для их устранения:

### Возможные причины

1. **Неправильная конфигурация балансировщика нагрузки**:
   - Убедитесь, что ваш балансировщик нагрузки правильно настроен на распределение запросов. Проверьте алгоритм балансировки (например, round-robin) и параметры, такие как таймауты соединений.

2. **Сетевые задержки**:
   - Соединение между балансировщиком нагрузки и вашим дополнительным сервером может быть медленным или нестабильным. Измерьте время отклика с помощью инструментов, таких как `ping` или `traceroute`, чтобы обнаружить возможные сетевые задержки.

3. **Проблемы с подключением к базе данных**:
   - Возможно, что два сервера обращаются к одной базе данных, и из-за этого время отклика запросов увеличивается. Проверить, как настроены подключения к базе данных. Рассмотрите возможность использования репликации или кэширования для снижения нагрузки на базу данных.

4. **Проблемы с конфигурацией сервера**:
   - Убедитесь, что конфигурации Nginx и PHP на обоих серверах оптимизированы. Возможно, стоит повысить значения параметров, таких как `worker_processes` и `worker_connections` в Nginx.

5. **Нехватка ресурсов на дополнительном сервере**:
   - Даже если оба сервера имеют одинаковые характеристики, возможно, дополнительный сервер загружен чем-то, что вызывает задержки. Проверьте использование ЦПУ и памяти на каждом сервере во время пиковых нагрузок.

6. **Кэширование**:
   - Если ваше приложение сильно зависит от базы данных для каждой операции, возможно, вам следует рассмотреть возможности кэширования (например, Redis или Memcached), чтобы уменьшить количество запросов к базе данных.

7. **Состояние сервера**:
   - Проверьте, не возникают ли на дополнительном сервере ошибки, которые могут замедлять обработку запросов (например, ошибки в PHP, таймауты).

8. **Логи**:
   - Анализируйте логи сервера (Nginx, PHP, MySQL) для обнаружения ошибок или предупреждений, которые могут указывать на проблемы.

### Рекомендации по решению проблемы

1. **Настройка балансировщика нагрузки**:
   - Проверьте и при необходимости скорректируйте настройки Cloudflare и/или HAProxy.

2. **Оптимизация баз данных**:
   - Проверьте индексы и оптимизируйте запросы; добавьте кэширование на уровне приложения или используйте Redis/Memcached.

3. **Мониторинг производительности**:
   - Используйте такие инструменты, как New Relic или Prometheus, чтобы отслеживать производительность вашего приложения и серверов.

4. **Тестирование производительности**:
   - Убедитесь, что оба сервера под нагрузкой обрабатывают запросы так же быстро. Используйте инструменты нагружения, такие как Apache Benchmark (ab) или JMeter, чтобы протестировать производительность в условиях нагрузки.

5. **Распределение нагрузки**:
   - Рассмотрите использование CDN, чтобы уменьшить нагрузку на ваши сервера.

6. **Лимитирование ресурсов**:
   - Используйте инструменты мониторинга для анализа использования ресурсов, чтобы избежать перегрузки сервера. Возможно, стоит увеличить ресурсы серверов.

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

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

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

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

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

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

5. Если проблема не в этом, то... https://youtu.be/bq3HksAwb2Q?si=NsBZeYeHsq69JW6o
Похожие вопросы