Optimizing PHP-FPM to get faster load times of tabs in Organizr¶
Written: 2018-07-15
Tags
Category
For me this all started when I was setting up Logarr and opened the Organizr(v1) container php error log /log/php/error.log
and saw that this error was repeating on an hourly basis:
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it[_timestamp_]
This means that there are not enough PHP-FPM processes. In Organizr v2 I did not get this error in the php error log, but optimizing the child processes still got me faster load times of tabs in Organizr.
Note that for this guide, it does not matter if you use Organizr V1 or V2.
We need write-access to /etc/php7/php-fpm.d/www.conf
in order to optimize the following settings:
pm pm.max_children pm.start_servers pm.min_spare_servers pm.max_spare_servers pm.max_requests
Copying the www.conf file to /config/php¶
We need to perform this step because the file must 'exist' before it can be mapped.
First docker exec into your Organizr docker container. Assuming you are using a fairly new version of UnRaid, click your Organizr container icon and then click "Console".
If not run docker exec -it [contrainername] bash
in the console
In the console window, run the command: cp /etc/php7/php-fpm.d/www.conf /config/php
A copy of www.conf is now present in Organizr's php-folder.
Linking the newly copied www.conf file to the original¶
Create the following new path for your Organizr docker container in UnRaid:
* Config Type: Path
* Name: phpchildren
* Container Path: /etc/php7/php-fpm.d/www.conf
* Host Path: /mnt/cache/appdata/organizr-v2/php/www.conf
* Access Mode: Read/Write
* Description: Container Path: /etc/php7/php-fpm.d/www.conf
The same is shown here:
Calculate and change settings in www.conf¶
Open the www.conf file with notepad++ or similar to edit the following values:
pm¶
**pm = dynamic**
means that the number of servers specified in pm.start_servers
will always be running in the PHP-FPM process, and more will be created if needed. pm = ondemand
means that **pm.start_servers**
is ignored and servers will be created if they are needed.
Personally, I have decided to use the default**pm = dynamic
** because I have very much RAM compared how loaded my webserver is. If I always needed resources to be freed up, I would have chosen the ondemand setting.
pm.max_children¶
Open the terminal in UnRaid. Run the command ps -ylC php-fpm --sort:rss
You will likely get a bunch of php-fpm processes like I do:
The RSS column shows non-swapped physical memory usage by PHP-FPM processes in kilobytes.
An appropriate value for pm.max_children can be calculated as: pm.max_children =
Total RAM dedicated to the web server / Max child process size
The max child process size for me is 19MB and my server-rig has 32GB of RAM. I decide that I want to use a maximum of, say, 20GB on PHP-FPM processes. Evaluating the formula with these values yields pm.max_children = 20000 / 19 = 1053 ~ 1000. Thus, Iset pm.max_children = 1000
. This is ridiculously high. But I have the RAM for it. For reference, in myshell's guide linked below, he concludes an appropriate pm.max_children = 72 with 8 GB ram installed, so the less RAM and more load you have on your server, the more important this calculation and setting becomes.
pm.min_spare_servers¶
Set pm.min_spare_servers = 1
pm.max_spare_servers¶
An appropriate value for pm.max_spare_servers can be calculated as: pm.max_spare_servers = 2 x number of cores OR 4 x number of cores
Personally I have 8 cores in my AMD Ryzen 1700 processor and start with using the 2x method. Evaluating the formula with these values yields pm.max_spare_servers = 2 x 8 = 16. Thus I set pm.max_spare_servers = 16
.But I could also try with pm.max_spare_servers = 32
and see if I get better performance with that.
pm.start_servers¶
An appropriate value for pm.start_servers can be calculated as: pm.start_servers = pm.max_spare_servers / 2 Evaluating this gives pm.start_servers = 16 / 2 = 8. Thus I set pm.start_servers = 8
.
pm.max_requests¶
Set pm.max_requests = 500
Concluding remarks¶
Restart your Organizr docker container and enjoy an even faster Organizr experience. Of course YMMV, tweak the settings above to further optimize, as they depend very much on your server hardware, the PHP-FPM processes you are hosting, and the load on your webserver, i.e. the number of simultaneous users.
Sources: https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/ https://ma.ttias.be/a-better-way-to-run-php-fpm/ https://stackoverflow.com/questions/25097179/warning-pool-www-seems-busy-you-may-need-to-increase-pm-start-servers-or-pm