Configuration
首先需要确定影响 php-fpm 子进程数的几个配置项。
# 设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。必须设置。
# static - 子进程的数量是固定的(pm.max_children)。
# ondemand - 进程在有需求时才产生(当请求时才启动。与 dynamic 相反,在服务启动时 pm.start_servers 就启动了。
# dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。
pm string
# pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。必须设置。
pm.max_children int
# 设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。
pm.start_servers int
# 设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。必须设置。
pm.min_spare_servers int
#设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。必须设置。
pm.max_spare_servers int
#秒数,多久之后结束空闲进程。 仅当设置 pm 为 ondemand。 可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:10s。
pm.process_idle_timeout mixed
#设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0。
pm.max_requests int
Question
了解了几个配置项之后,在进行php-fpm子进程数配置调整之前, 还需要搞清楚两个问题:
1. 每个 php-fpm 子进程平均占用多少内存?
2. 当前 website 所在的服务器有多少空余内存资源可供 php-fpm 使用?
Explain
查看每个php-fpm子进程平均占用内存
[~]# ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }'
46Mb
查看系统当前空余内存
[ ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 210M 938M 404K 2.6G 3.2G
Swap: 0B 0B 0B
demo1
在设置pm是static的时候,php-fpm 子进程最大数量受 pm.max_children 影响,建议设置为 M/m*1.2 , M是系统可用内存资源, m是子进程平均占用内存。
系统空余内存 3.2 时, 假如存在其他服务,保留1G其他服务使用, 理想可用内存为 3.2-1-0.5 = 1.7G 。
pm.max_children = 1.7x1024/(46x1.2) = 31
pm static
pm.max_children 31
pm.max_request = 1000
demo2
当设置pm是dynamic时,受 pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers 影响 。
pm.max_children = 31
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_request = 1000
参考资料: