如何对php-fpm进行调优?
就以我自己的腾讯云轻量服务器为例
- 操作系统:OpenCloudOS 8
- CPU:2核
- 内存:2GB
- 系统盘:SSD云硬盘 50GB
- 流量包:300GB/月(带宽 4Mbps)
2核2G 服务器下的最优配置计算
基于 2GB (2048 MB) 总内存,我们需要为其他服务预留空间:
- 内存预算分配:
- 操作系统内核及缓冲: ~200 MB
- Nginx: ~50-100 MB (取决于并发连接数)
- MySQL/MariaDB: ~600-800 MB (数据库是内存大户,必须留足,否则查询极慢)
- 剩余给 PHP-FPM 的安全内存:2048−200−100−700≈1048MB
调优计划
前提:2GB内存服务器,且自行安装Nginx、MySQL、Redis,那么需留给操作系统、MySQL、Nginx、Redis等至少800MB。 所以:可以留给php-fpm的可用内存,也就是约2048MB - 800MB = 1248MB
现在开始进行调优准备
查看目前服务器,单个php进程的内存占用情况:
ps -ylC php-fpm --sort:rss | awk '{sum+=$8; n++} END {printf "Avg Memory: %.2f MB\n", sum/n/1024} # 输出结果 Avg Memory: 13.18 MB查看真实的每个php进程的内存占用情况:
ps -ylC php-fpm

数据分析:单进程真实内存占用
- PID 906 (Master 进程): RSS 31596 KB (~30.8 MB)
- 这是主进程,负责管理,不计入并发计算。
- Worker 进程 (PID 1083 - 1107):
- RSS 均在 13028 KB - 13032 KB 之间。
- 换算为 MB: 13030/1024≈12.72 MB。
结论:目前的 PHP-FPM 子进程非常轻量,单个进程仅占用约 12.7 MB 内存。
- 计算 pm.max_children
- 公式: 可用内存 / 单进程内存
- 计算: 1048 MB / 12.7 MB ≈ 82 个进程
安全系数:为了防止突发流量导致内存瞬间飙升触发 OOM,建议每个work分配35MB(这是一个对轻量应用比较合理的预估值,40M已经满足绝大部分业务场景)
- 计算: 1048 MB/35 MB≈29.9。
- 推荐值:25 - 30
推荐配置文件 (www.conf)
有的php环境,并没有在php-fpm.conf中引入www.conf,需要注意; 如果需要手动引入,
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# 在php-fpm.conf的底部增加配置:
include=/usr/local/php/etc/php-fpm.d/*.conf
编辑www.conf的内容:
# 先备份源文件
cp /usr/local/php/etc/php-fpm.d/www.conf /usr/local/php/etc/php-fpm.d/www.conf.bak
# 开始编辑/usr/local/php/etc/php-fpm.d/www.conf
sudo vi /usr/local/php/etc/php-fpm.d/www.conf
# 可参考配置如下内容:
[www]
; 1. 进程管理模式: 动态
pm = dynamic
; 2. 最大子进程数: 核心参数
; 目前是20,建议设为 25-30即使进程内存膨胀到 40MB,25个进程也只需 1GB,非常安全。
pm.max_children = 25
; 3. 启动时创建的进程数
; 设为 max_children 的 40% 左右,保证启动后有足够进程待命
pm.start_servers = 10
; 4. 最小空闲进程数
; 保持 5-8 个空闲进程,应对突发小流量
pm.min_spare_servers = 10
; 5. 最大空闲进程数
; 超过 15 个空闲进程就回收,释放内存给 MySQL
pm.max_spare_servers = 15
; 6. 每个进程处理请求后重启
; 防止长期运行导致的内存碎片或微小泄漏
pm.max_requests = 500
; 7. 每个空闲(Idle)的 PHP-FPM 子进程在被关闭(回收)之前,可以保持空闲状态的最大时间
; 仅当 pm = dynamic 或 pm = ondemand 时有效。如果 pm = static,此参数被忽略。
pm.process_idle_timeout = 10s
; 8. 请求超时限制
; 防止慢脚本卡死所有进程
request_terminate_timeout = 100
; 9. PHP-FPM 中用于诊断性能瓶颈的核心参数。它决定了当一个脚本执行时间超过多少秒时,PHP-FPM 会将该请求的完整堆栈跟踪(Stack Trace)记录到慢日志文件中。
; 0(表示禁用,不记录慢日志)。
; 如果配置了参数,如:0.5s,则必须同时配置 slowlog 路径才能生效(指定慢日志路径:slowlog = /var/log/php-fpm/slow.log,确保该目录存在且 PHP-FPM 用户有写入权限)
request_slowlog_timeout = 0
保存退出后,进行语法检查
php-fpm -t
确保显示 syntax is ok
其他事项
- 无意间在执行命令:php-fpm -t的时候,提示:ERROR: failed to open error_log (/usr/local/php/var/log/php-fpm.log): Permission denied (13)
- 解决办法是:sudo chmod 777 ./usr/local/php/var/log/php-fpm.log,确保可写入
- 不同的业务场景,有不同的调优参数。本手册的配置值,只是基于我自己的服务器和业务的常规配置,我甚至都没有去设置php-fpm慢日志,但是方法是通用的,祝君好运;