When setting these options consider the following:
- How long is your average request?
- What is the maximum number of simultaneous visitors the site(s) get?
- How much memory on average does each child process consume?
sudo grep max_children /var/log/php?.?-fpm.log.1 /var/log/php?.?-fpm.log
free -h
- All fpm processes:
ps -ylC php-fpm7.0 --sort:rss
- Average memory:
ps --no-headers -o "rss,cmd" -C php-fpm7.0 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
- All fpm processes memory:
ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep php-fpm
-
pm.max_children = Total RAM dedicated to the web server / Max child process size
-
System RAM: 2GB
-
Average Pool size: 85Mb
-
pm.max_children = 1500MB / 85MB = 17
max_children = (average PHP script execution time) * (PHP requests per second)
visitors = max_children * (seconds between page views) / (avg. execution time)
sudo vim /etc/php/7.0/fpm/pool.d/www.conf
pm.max_children = 17
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_request = 1000
; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
;
; pm.start_servers - the number of children created on startup.
; this value must not be less than min_spare_servers
; and not greater than max_spare_servers.
;
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
;
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
Hi @holmberd,
How did you came up with the values for the following?
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Is it safe to calculate it this way?
pm.start_servers = No. of cpu cores x 4
pm.min_spare_servers = No. of cpu cores x 2
pm.max_spare_servers = No. of cpu cores x 4
I have a t3.small server which has 2 cpus and 2 gb ram, is it okay to use the setting below with 'dynamic'?
Average Process = 70mb
RAM = 1900mb
pm.max_children = 27
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_request = 1000