PHP-FPM的进程管理方式及优化
目录
概述
PHP-FPM 有两个主要分支,分别对应 PHP 5.2.x 和 PHP 5.3.x 版本。在 5.2.x 中配置为 XML 格式,5.3.x 后改为与 php.ini 相同的配置风格。
PHP-FPM 支持两种进程管理方式:static(静态)和 dynamic(动态)。在早期版本中 dynamic 被称作 apache-like。
Static 模式
特点:php-fpm 进程数自始至终保持恒定,不会增加或减少。
参数:只有 pm.max_children 生效,表示开启的进程数量。
pm = static
pm.max_children = 100
适用场景:
- 内存充足的服务器(8GB 以上):可以设置较大的固定进程数,避免频繁的进程启停
- 服务器内存足够时效率最高,因为不需要额外的进程数目控制开销
- 进程数计算:
内存 / 30MB,如 8GB 可设 100,耗费内存 2-3GB
Dynamic 模式
特点:php-fpm 进程数根据负载动态增减,在 pm.min_spare_servers 和 pm.max_spare_servers 之间调整。
参数:
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 50
参数说明:
pm.start_servers:启动时的初始进程数pm.min_spare_servers:最小空闲进程数,不足时会创建新进程pm.max_spare_servers:最大空闲进程数,超过时会杀死多余进程pm.max_children:最大进程数上限
适用场景:
- 内存受限的服务器(256MB-1GB VPS):动态模式会结束多余进程,回收内存
- 进程数计算:
内存 / 20MB,如 512MB 建议pm.max_spare_servers = 20,pm.min_spare_servers = 5-10
内存泄露问题
PHP-FPM 进程在执行过程中会有内存泄露问题(类似 Apache):
- 刚启动时占用约 3MB
- 运行一段时间后会上升到 20-30MB
为了防止无限增长,应该设置 pm.max_requests 让进程定期重启。
优化建议
大内存服务器(8GB+)
pm = static
pm.max_children = 250
静态方式效率高,避免进程管理开销。
小内存服务器(1GB)
pm = dynamic
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_children = 50
动态方式更加平稳,可回收释放内存。
超小内存 VPS(256MB)
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_children = 12
严格控制进程数,防止内存溢出。
实现历史
在 PHP 5.2.x 版本中,apache-like 模式形同虚设,实际配置并未生效。直到 PHP 5.3.x 才真正实现了动态进程管理,并改名为 dynamic,使概念更加清晰。
性能对比
与 Apache 类似,选择哪种模式主要取决于服务器的硬件资源:
- Static 优势:无需进程管理开销,性能稳定
- Dynamic 优势:节省内存,可应对流量波动
- 对于 HTTP POST 请求,两者在处理大数据上传时都需要调整超时参数