PHP5之前是采用PHP-CGI,PHP-CGI是PHP解释器,它是个CGI程序,本身只能解析请求,不能管理进程。
PHP7之后采用PHP-FPM,调度管理PHP-FastCGI进程的程序,在PHP5.3.3之前是php内核的一个补丁包,在后来的版本中php内核集成了php-fpm。(补充:PHP8增加了编译方法和一些function,在FCGI这里没有什么变化)
FCGI原理是先fork master 进程,初始化执行过程之后,再fork worker进程。如果worker 进程不够用,master还会预先启动一些worker进程,而worker 较多的时候也会关掉一些。
FasterCGI通过socket 和FPM(fasterCGI process manager) 进行交互,是基于socket 通信,分布式
关键参数的设置:
-
pm String string可能的值:static / ondemand / dynamic
- static: 子进程child process 的数目固定,此设定下等于pm.max_children的数目
- ondemand: 此设定下=pm.start_servers 指定的数目
- dynamic: child process 数目由以下的参数决定:
- pm.max_children
- pm.start_servers
- pm.min_spare_servers
- pm.max_spare_servers
-
pm.max_children
static: 创建的子进程数目
dynamic: 创建的最大子进程数目
计算公式= total usable memory / 单个service 需要的大致memory
例如,用free命令 check可用Memory 3.8G,单个service 使用memory 假定为256MB, 则max_children=3800/256≈15 -
pm.start_servers
master process 启动时创建的子进程数目
default 计算公式: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
例如:可用3.8G,实际可使用率30%~40%,则=3800x0.35/256≈5.1 ,设为5MS consultant advice: CPU number x 一个service 使用的memory 数目?(要确认一下会议记录)
-
pm.min_spare_servers
dynamic的时候有效
idle child process 的最小值
例如:设为和start_servers 同样数值, 设为5 -
pm.max_spare_servers
dynamic的时候有效
idle child process 的最大值
例如: 假定memory 使用率70%, 3800 x 0.7 / 256 ≈ 10.3, 设为10 -
pm.max_requests = 500
最大请求数:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。
这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。(PHP是会造成内存泄露的!!!) -
pm.process_idle_time
default = 10s
还有一种计算方法(Sebastian Buckpesch)
max_children = (total RAM - memory used for linux,DB, etc) / process size
start_servers = number of CPU core x 4
min_spare_servers = number of CPU core x 2
max_spare_servers = start_servers
eg. 可用memory 8G-2G=6G, php-fpm 的process size = 62.2MiB
则 max_children = 6.192/62.2 ≈ 100,
2个CPU,每个4core, 所以 start_servers = (2 x 4) x 4 = 32
min_spare_servers = (2 x 4)x 2 = 16
max_spare_servers = start_servers = 32
参考URL:
https://zhuanlan.zhihu.com/p/110540192
https://zhuanlan.zhihu.com/p/137011384
https://www.plesk.com/blog/various/why-do-you-need-php-fpm/
https://tideways.com/profiler/blog/an-introduction-to-php-fpm-tuning
https://qiita.com/mizutsu/items/29ec160c4e830c138132
PHP 内核
PHP internals book
网友评论