PHP-FPM Tuning for Performance + Low Memory

PHP-FPM has a default configuration that uses more memory than necessary. It has spare PHP-FPM processes ready to run, taking up memory in case there is PHP code to process. While not a problem, if you have tons of RAM it can be a problem for low VPS RAM and if you are using aggressive page caching then this memory is unnecessarily used which can be used for MariaDB (MySQL) or other important processes. This guide explains how to configure Nginx with PHP-FPM running PHP 7.0 to use as little RAM as possible.

PHP-FPM Tuning for Performance + Low Memory

Open the PHP-FPM configuration file for PHP 7.0.

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

Adjust the following values ​​as shown below, pay attention to front pm.start_servers, pm.min_spare_servers and pm.max_spare_servers

pm = ondemand means that child processes in PHP-FPM will be spawned only when needed

pm.max_children this is the maximum number of child processes that will be allowed, 50 is quite liberal, but if you see in your log archive that the number of child processes has exceeded the maximum value, then you need to increase this value

pm.process_idle_timeout kills child processes after they have been idle for 10 seconds

pm.max_requests sets the maximum number of PHP requests for each child process

pm = ondemand

; Число дочерних процессов, которые будет создано, когда pm установлен в 'static' и
; Максимальное число дочерних процессов, когда pm установлен в 'dynamic' и 'ondemand'.
; Это значение устанавливает ограничение на количество одновременных запросов, которые будут
; запускаться. Эквивалент директивы ApacheMaxClients в mpm_prefork.
; Эквивалентная переменная среды PHP_FCGI_CHILDREN в оригинальном PHP
; CGI. Ниже, по умолчанию основаны на сервере без использования значительных ресурсов. Не
; забудьте настройки часов.* чтобы соответствовать вашим потребностям.
; Примечание: используется, когда pm установлен в 'static', 'dynamic' или 'ondemand'
; Примечание: это значение является обязательным.
pm.max_children = 50

; Число дочерних процессов, созданных при запуске.
; Примечание: используется только тогда, когда pm установлен в "dynamic"
; Значение по умолчанию: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
;pm.start_servers = 2

; Требуемое минимальное число неактивных процессов сервера.
; Примечание: используется только тогда, когда pm установлен в "dynamic"
; Примечание: обязательное, когда pm установлен в "dynamic"
;pm.min_spare_servers = 1

; Требуемое максимальное число неактивных процессов сервера.
; Примечание: используется только тогда, когда pm установлен в "dynamic"
; Примечание: обязательное, когда pm установлен в "dynamic"
;pm.max_spare_servers = 3

; Число секунд, по истечении которых бездействующий процесс будет убит.
; Примечание: используется только тогда, когда pm установлен в 'ondemand'
; Значение по умолчанию: 10s
pm.process_idle_timeout = 10s;

; Число запросов после которых дочерний процесс будет перезапущен.
; Это может быть полезно во избежания утечек памяти в 3-й партии библиотек. Для
; бесконечной обработки запроса укажите '0'. Эквивалент PHP_FCGI_MAX_REQUESTS.
; Значение по Умолчанию: 0
pm.max_requests = 500

Check your PHP-FPM config syntax is correct

php-fpm7.0 -t

You should see the configuration is in effect

[01-Jun-2017 15:51:34] NOTICE: configuration file /etc/php/7.0/fpm/php-fpm.conf test is successful

You can now restart php7.0-FPM

sudo service php7.0-fpm restart

You can see that the amount of RAM is being used significantly less.

Sidebar