Linux上提升 PHP-FPM 处理速度的系统化做法
一 进程与监听层优化
- 选择进程管理模式:高并发且稳定的场景优先用 pm=dynamic;资源严格受限或短任务可用 pm=ondemand;可控负载且追求极致稳态可用 pm=static。
- 合理设置进程数量:用“单进程平均内存 × 并发目标”反推 pm.max_children,避免内存被耗尽;空闲进程用 pm.min_spare_servers / pm.max_spare_servers 平滑承接突发流量。
- 连接与超时:优先使用 Unix Socket 减少网络栈开销;按需设置 request_terminate_timeout(避免过长脚本占用);开启 request_slowlog_timeout 与 slowlog 定位慢请求。
- 文件描述符:提升 ulimit -n 与系统级 fd 限制,防止“Too many open files”。
- 示例(可按需微调):
- pm=dynamic;pm.max_children=50;pm.start_servers=5;pm.min_spare_servers=5;pm.max_spare_servers=35
- request_terminate_timeout=30s;request_slowlog_timeout=10s;slowlog=/var/log/php-fpm/slow.log
- listen=/run/php/php{version}-fpm.sock;listen.owner=www-data;listen.group=www-data;listen.mode=0660
二 PHP 运行时与字节码缓存
- 启用并优化 OPcache:
- opcache.enable=1;opcache.memory_consumption=128(可按内存提升到 256/512MB)
- opcache.interned_strings_buffer=8;opcache.max_accelerated_files=4000–10000(按项目文件数)
- opcache.revalidate_freq=60(开发环境可设 0 便于调试)
- 合理设置脚本资源:如 memory_limit=256M、max_execution_time=30,避免无谓限制或过度放开。
- 升级 PHP 版本:新版本通常带来显著的性能与安全改进。
三 数据层与传输层优化
- 数据库:减少 N+1 查询与全表扫描,建立合适索引;使用 持久连接 或连接池降低握手开销;必要时引入 Redis/Memcached 做数据缓存。
- Web 传输:启用 HTTP/2 多路复用;开启 Gzip/Brotli 压缩;对静态资源设置长 Cache-Control,尽量由 Nginx/CDN 直接服务,减少进入 PHP-FPM 的请求比例。
四 监控 基准测试 与 渐进式调优
- 监控与观测:用 htop/vmstat/iostat 观察 CPU/内存/IO;开启 PHP-FPM 状态页 与 slowlog 定位瓶颈;结合 Prometheus + Grafana 做长期可视化。
- 基准测试:在接近生产的镜像环境,使用 ab/wrk/siege 做渐进加压,观察 RPS、P95/P99 延迟、错误率、CPU/内存占用,以数据驱动参数收敛。
- 渐进式调优流程:
- 基线采集 → 2) 仅启用 OPcache → 3) 优化进程与监听 → 4) 优化 DB/缓存 → 5) 传输层优化 → 6) 回归压测与容量评估;每次只变更少量参数并保留回滚方案。
五 关键配置示例与容量估算
- 示例片段(/etc/php/{version}/fpm/pool.d/www.conf):
- [www]
- listen = /run/php/php{version}-fpm.sock
- listen.owner = www-data;listen.group = www-data;listen.mode = 0660
- user = www-data;group = www-data
- pm = dynamic;pm.max_children = 50;pm.start_servers = 5;pm.min_spare_servers = 5;pm.max_spare_servers = 35
- request_terminate_timeout = 30s;request_slowlog_timeout = 10s;slowlog = /var/log/php-fpm/slow.log
- php_admin_value[memory_limit] = 256M;php_admin_value[max_execution_time] = 30
- 容量估算方法:
- 单进程内存 ≈ 应用常驻内存 + OPcache 开销(如 128MB)
- 可承载并发 ≈ floor(可用内存 / 单进程内存)
- 结合压测校准 pm.max_children 与 pm.start_servers,确保既不饱和也不过度闲置。