Настройка производительности PHP-FPM - всплески трафика

У меня есть веб-приложение, написанное на Laravel/PHP, которое находится на ранних стадиях и обычно обслуживает около 500 - 600 запросов/мин. Мы используем Maria DB и Redis для кэширования, и все находится на AWS.

Для событий, которые мы хотим продвигать на нашей платформе, мы отправляем push-уведомление (мобильная платформа) всем пользователям, что приводит к всплеску трафика примерно на 2 минуты, который приводит нас к 3,5 тыс. запросов/мин.

При текущем масштабе сервера это полностью загружает ЦП серверов приложений, которые обычно работают на частоте около 10% ЦП. Во время этого всплеска кластеры баз данных и Redis выглядят нормально.

Глядя на журналы, кажется, что все процессы рабочего пула PHP-FPM заняты и начинают ставить в очередь запросы от восходящего потока Nginx.

В настоящее время у нас есть:

  • три серверы m4.large (2 ядра, 8 ГБ ОЗУ каждое)

  • динамическое управление процессами PHP-FPM с максимальным количеством 120 дочерних процессов (серверов) на каждом поле

Мои вопросы:

1) Должны ли мы увеличить пул FPM? Кажется, что с точки зрения памяти мы, вероятно, приближаемся к нашему пределу

2) Должны ли мы снижаться пул FPM? Кажется возможным, что мы запускаем так много процессов, что процессор увязает и не может действительно завершить ни один из них. Интересно, получим ли мы лучшие результаты с меньшими затратами.

3) Должны ли мы просто использовать более крупные блоки с большим количеством оперативной памяти и процессора, что позволит нам добавить больше FPM-воркеров?

4) Есть ли какая-либо настройка производительности FPM, которую мы должны рассмотреть? Мы используем Opcache, однако должны ли мы переключиться на статическое управление процессами для FPM, чтобы сократить накладные расходы на процессы, вращающиеся вверх и вниз?

Какие-нибудь фрагменты неэффективного кода, которые вы могли бы настроить?

Reed 21.03.2019 06:06

@Reed, мы максимально оптимизировали на данный момент, поэтому мы оцениваем аспект fpm.

djt 21.03.2019 06:32

Вы всегда можете увеличить размер пула, по крайней мере временно, до того, как произойдет продвижение, вы также можете добавить больше серверов в свою группу масштабирования или включить автоматическое масштабирование (если всплеск не превышает скорость, с которой AWS может загружать экземпляры).

apokryfos 21.03.2019 08:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
3
2 605
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Слишком много дочерних процессов по отношению к количеству ядер.

Во-первых, вам нужно знать состояние сервера во время обычный и лопаться.

1) Проверьте количество процессов php-fpm.

ps -ef | grep 'php-fpm: pool' | wc -l

2) Проверьте средняя нагрузка. При 2 ядрах 2 и более означает, что начало работы задерживается.

top
htop
glances

3) В зависимости от сервиса начинаем настраивать с удвоенного количества ядер.

; Example
;pm.max_children = 120       ; normal) pool 5, load 0.1 / burst) pool 120, load 5  **Bad**
;pm.max_children = 4    ; normal) pool 4, load 0.1 / burst) pool 4, load 1
pm.max_children = 8    ; normal) pool 6, load 0.1 / burst) pool 8, load 2  **Good**

load 2 = Maximum Performance 2 cores


Более точно протестировать веб-сервер с нагрузкой, аналогичной фактической нагрузке, с помощью бенчмарка apache (ab).

ab -c100 -n10000 http://example.com

Time taken for tests:   60.344 seconds
Requests per second:    165.72 [#/sec] (mean)
 100%    880 (longest request)

Это достойный совет. 120 процессов может быть много. Начать с количества ядер и масштабирования в тестах до тех пор, пока все не остановится, — это достойная стратегия оптимизации.

Arend 21.03.2019 09:28

спасибо за этот ответ! Я просто хочу уточнить: у меня 125 максимальных серверов, 25 стартовых серверов. Первый лог PHP, который мы получили на одном из ящиков во время взрыва, был: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 32 total children.

djt 21.03.2019 14:22

Кроме того, когда вы говорите Check the load average. At 2 cores, 2 or more means that the work's starting delayed. . Вы имеете в виду, проверить загрузку процессора?

djt 21.03.2019 14:25

«Использование ЦП» и «средняя нагрузка» отличаются. tecmint.com/…

Been Kyung-yoon 22.03.2019 02:03

Другие вопросы по теме