zkrvndm
@zkrvndm
Архитектор решений

Как ускорить PHP FPM?

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

У меня в настройках панели, есть 4 заветных параметра:
1) pm.max_children
2) pm.start_servers
3) pm.min_spare_servers
4) pm.max_spare_servers

К параметру pm.max_children у меня вопросов нет, я так понимаю, чем значение больше, тем большее количество php-процессов сервер может параллельно отрабатывать. Соответственно, я выкрутил этот параметр на максимум, так как ограничений по памяти и ядрам у меня нет (мощностей хоть жопой жри).

Однако, у меня есть вопросы к остальным трём параметрам. Я хоть и прочитал расшифровку в доках, но так и не понял, при каких значениях сервер будет работать быстрее? Увеличением потребления ресурсов можно пренебречь, так как мне именно это и надо: чтобы больше жрало, но и быстрее обрабатывало каждый отдельно взятый запрос.
  • Вопрос задан
  • 944 просмотра
Решения вопроса 1
Mister_X
@Mister_X
Когда-то я пользовался таким способом:
1. вычисляем свободную память = весь объём памяти - объём памяти занимаемый системой.
Например: 32 Гб - 8 Гб = 24 Гб потенциально свободной памяти.

2. вычисляем среднюю память занимаемую одним процессом PHP:
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
Например: 36 Мб
Примечание: php-fpm в строке выше замените на вашу, если отличается, например php5-fpm
Команда top, htop в помощь

3. итого, ставим 24000 Мб / 36 Мб = 666
pm.max_children = 666

Но не надо забывать, что кроме PHP-FPM системой пользуются и другие процессы.
Я бы ставил max_children в пределах 2/3 от вычисленной цифры.

Но вы всегда можете экспериментировать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Блокировка сессий скорее всего у Вас.
Для группы пользователей "все"/"everyone" - сессий внутри кода обработки быть не должно.
Проверьте тестом ab на скрипт без сессий.
А потом - с сессиями (с изменением хотя бы одной сессионной переменной).
И посмотрите на разницу в скорости обработки.

Посмотрите на тайминги выполнения запросов/ответов к БД.
Кэшируйте часто используемые и редко изменяемые данные в памяти (профиль или боковые панели веб-страницы, к примеру) и обновляйте кэш при их модификации (отслеживайте "флагом" с простым запросом в БД, например).
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы