Некоторое время боролся с оптимизацией менеджера php, читая различные источники, пришел к выводу, что народ в большей части не понимает, как это работает и как его нужно запускать. Итак, во-первых, обращу внимание на параметр pm.status_path, который можно выставить равным в какой-то URL, например, /status.php, чтобы при запросе
https://olegon.ru/status.php можно было увидеть статистику использования менеджера (у меня отключена сейчас). Да, рекомендации таковы, чтобы суффикс .php не использовать, но если его не поставить, то nginx зарулит его неизвестно куда и статистики можно не дождаться. Включаете параметр, идете по заданному url и тип-топ, обновляете по F5 статистику.
Суть использования менеджера процессов php в том, чтобы запустить минимальное количество процессов, но таким образом, чтобы при работе они не создавались постоянно новые, поскольку это занимает время и ресурсы, только при условии, что этих процессов не болталось большое количество без дела, поскольку даже пустые они потребляют ресурсы, например, память. В статистике выше будет видно их максимальное и текущее использование. Обращаю внимание, что не следует выставлять сразу в максимум, это бессмысленно, поскольку бывают какие-то обвалы, во время которых системе следует немного подтормаживать, зато цель избавления от иждивенцев будет достигнута. Например, у меня есть некоторые скрипты, при запуске которых количество процессов подскакивает до 16, но тем не менее, конфиг, как ниже.
php-fpm.conf
Код:
[global]
error_log = /var/log/php-fpm.log
log_level = warning
emergency_restart_threshold = 50
emergency_restart_interval = 6h
process_control_timeout = 30m
[www]
listen = /var/run/fcgi-php.sock
listen.backlog = 4000
user = nginx
group = nginx
pm = dynamic
pm.max_children = 32
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 250
request_terminate_timeout = 10m
request_slowlog_timeout = 0s
Конфигурация сервера - 8Гб, 4 ядра.
Поясню. Во-первых, children и servers - это одно и то же, я перерыл немало документации, пытаясь догадаться, сколько children'ов у каждого сервера и как они распределяются, подозревая аналогичность тому же апачу. Т.е. во всех случаях идет речь о процессах, выполняющих PHP-код.
Во-вторых, max_children не стоит задирать в слишком большие значения, поскольку процессы php достаточно ресурсоемки и при некотором нажиме со стороны какого-нибудь бота ваш сервер истечет памятью или завалится в своп.
В-третьих, по умолчанию backlog в конфиге 128, а в моем случае еще и был выставлен в -1, не знаю кем, возможно и мной. Это неправильно, при диком всплеске активности backlog (очередь из запросов, которые не будут успевать обрабатываться процессами) будет расти, но это подразумевает дикую загрузку и пользователь не будет дожидаться обработки своего запроса долгое время, а обрабатываться он все равно будет, даже если пользователь давно ушел. Соответственно, лучше переполнить очередь выдавать 502, чем обрабатывать кучу ненужных запросов, заставляя ждать пользователей. Естественно, если у вас обычный ресурс, а не игровой сервер, например, где надо ждать до последнего. Обращаю внимание, что при выставлении этого параметра необходимо посмотреть, как настроена система, чтобы не дать приложению задание ждать очередь, которую не поддержит система
Код:
sysctl -a | grep backlog
Параметр max_requests выставлен для того, чтобы отработав 250 запросов сервер умирал, и новый сервер был создан (в случае нехватки резервных), что позволяет обновить структуру, подтекающим кривым PHP-кодом из какого-нибудь вордпресса.
Ну и к основным параметрам pm.min_spare_servers = 2 и pm.max_spare_servers = 4. Поскольку у меня 4 ядра и все время работающие 2-5 серверов (конечно не только PHP занятые), я решил, что вечное подпрыгивание с 2 до 5 процессов с их созданием - плохая идея. Для ровной работы я сконфигурировал, как видно выше, простаивающие 2 сервера в минимуме и не убивать сервера, если их 4 или менее. Речь идет о том, что если нет минимума, то сервера будут подготовлены по 2 штуки, ускоряя использование при всплеске активности (не придется создавать сервер, когда он будет нужен), а убиваться будут сервера только в случае, если их более 4 штук бездействующих.