PHP-FPM 通过 多进程 + 队列 模型处理高并发请求。其核心流程如下:
当并发请求数超过 pm.max_children 时,新请求会在 FPM 内部队列中等待,若队列也满了,Nginx 便会返回 502/504 错误。因此,优化高并发的关键在于 合理设置进程模型与数量、减少单请求耗时、并协同 Nginx 与 Linux 系统。
pm)在 www.conf 中配置,决定了子进程的创建和管理方式。
| 模式 (pm) | 工作方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
static |
启动时创建固定数量的子进程,运行中不再增减。 | 无进程创建开销,延迟稳定,QPS 可预期。 | 内存占用固定,需精准评估。 | 流量稳定、追求极致低延迟的核心服务。 |
dynamic |
根据负载动态增减子进程,有闲置回收机制。 | 内存使用灵活,适合流量波动大的场景。 | 参数不当易导致频繁启停,增加开销。 | 大多数网站、业务有峰谷波动的场景。 |
ondemand |
请求来时才创建进程,空闲后超时回收。 | 空闲时几乎不占用内存。 | 冷启动时延迟高,突发流量下队列易堆积。 | 低并发或间歇性任务。 |
建议:优先使用 dynamic 模式,待流量稳定且资源充足时,可尝试 static 模式以追求更高性能。
合理配置进程数是避免资源浪费或请求排队的关键。
pm.max_children (最大子进程数)
可用内存 ÷ 单进程峰值内存max_children 理论上限约为 50 (4000MB / 80MB)。务必为系统和其他服务预留 20-30% 的内存。pm.start_servers (初始进程数)
CPU核心数 × 2~4。pm.min_spare_servers / pm.max_spare_servers (空闲进程数)
min_spare_servers 可设为 CPU核心数 × 2,max_spare_servers 可设为 CPU核心数 × 4。这能让 FPM 平滑应对流量突增。pm.max_requests (进程重启周期)
500~1000。用于周期性重启子进程,以缓解潜在的内存泄漏和内存碎片问题。防止个别慢请求耗尽所有进程资源。
request_terminate_timeout:脚本最大执行时间。API 接口建议 15~30s,后台任务可酌情延长。设为 0 表示不主动终止,需配合慢日志和熔断策略。request_slowlog_timeout & slowlog:记录执行时间超过阈值的“慢请求”及其调用栈,是定位性能瓶颈(如慢 SQL、复杂逻辑)的利器。fastcgi_read_timeoutfastcgi_send_timeout减少通信开销,并解除系统层面的资源瓶颈。
listen)
listen = /run/php/php-fpm.sock。本地通信,性能优于 TCP,开销更小。listen = 127.0.0.1:9000。适用于容器或跨主机通信。ulimit)
net.core.somaxconn (监听队列长度) 和 net.ipv4.tcp_max_syn_backlog (SYN 队列长度),以应对瞬时连接洪峰。提升单个请求的处理效率,从根本上减轻 FPM 压力。
启用 OPcache:这是提升 PHP 性能的“标配”。 ini opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60
优化资源配置:合理设置 memory_limit (如 128M-256M) 和 max_execution_time,避免资源被过度占用或过早终止。
代码与架构优化:
通过前端和集群分担压力。
worker_processes (通常等于 CPU 核心数) 和 worker_connections,并开启 Keep-alive 复用连接。通过数据驱动持续优化,而非盲目修改配置。
pm.status_path = /status,用于实时监控进程数、排队数、慢请求等关键指标。slowlog 和 Nginx 的 access.log,找出性能瓶颈。ab、wrk 等工具在预发布环境模拟高并发场景,观察系统指标,找到性能拐点。