如何在Ubuntu上测试PHP-FPM性能
小樊
40
2026-01-03 03:07:47
Ubuntu上测试PHP-FPM性能的可复现流程
一 准备与基线
- 安装常用压测与监控工具:sudo apt-get install -y apache2-utils siege wrk php-cli
- 启用并验证PHP-FPM状态页(用于观察排队与进程利用)
- 编辑池配置(如:/etc/php/8.1/fpm/pool.d/www.conf),确保包含:pm.status_path = /status
- 在Nginx对该路径做访问控制(仅内网/本地),并重启服务:sudo systemctl restart php8.1-fpm nginx
- 访问示例:curl -s ‘http://127.0.0.1/status?json’ | jq
- 打开PHP-FPM慢日志,定位耗时脚本:
- slowlog = /var/log/php-fpm/www-slow.log;request_slowlog_timeout = 1s
- 重启后压测期间产生的慢请求会记录到该文件。
二 压力测试工具与示例命令
- 使用 ab(Apache Bench)做基线测试(适合快速吞吐与延迟评估)
- ab -n 10000 -c 200 http://localhost/index.php
- 使用 siege 做多URL与更灵活并发控制(支持随机/轮询策略)
- siege -c 200 -t 60s -b http://localhost/index.php
- 使用 wrk 做长连接与更高并发场景(HTTP/1.1 keepalive)
- wrk -t 4 -c 200 -d 60s http://localhost/index.php
- 建议做法:先用中等并发(如c=50~200)跑多轮,再逐步加压,观察指标拐点与错误率变化。
三 关键指标与实时监控
- PHP-FPM状态页重点看:active processes、idle processes、accepted conn、slow requests;配合日志观察错误与慢脚本。
- Nginx侧观察:active connections、每秒请求数、4xx/5xx错误率(可用 stub_status 模块)。
- 系统资源:CPU、内存、负载、文件句柄(ulimit -n)、网络;必要时用 htop/ss/top 辅助。
- 瓶颈定位思路:若 Nginx CPU 高而 PHP-FPM 低,多为静态资源或缓存问题;若 PHP-FPM CPU 高,多为代码/SQL/缓存命中问题;结合慢日志与性能分析工具(如 Xdebug/perf)深入定位。
四 示例测试计划与结果判读
- 步骤
- 预热:运行一次小规模压测(如 n=1000, c=50),排除冷启动影响。
- 基线:ab -n 10000 -c 200 记录 RPS、平均/最大延迟、50x比例。
- 递增并发:c=400、800(或 wrk -c 400/800),每档至少跑60秒,观察稳定性与错误率。
- 长稳压测:选择目标并发(如 c=200),持续10~30分钟,观察内存泄漏、慢日志增长、进程重启(pm.max_requests 触发)。
- 峰值边界:继续加压至出现稳定 5xx/超时/连接失败,记录拐点并发与资源占用。
- 判读要点
- 吞吐(RPS)随并发先升后平或下降,拐点常由进程数/数据库/网络/锁竞争等限制。
- 平均延迟上升但RPS未升,多为后端瓶颈(DB/外部API/锁)。
- 错误率升高或队列堆积,检查 PHP-FPM 进程数、慢日志、Nginx 超时与连接配置。
五 常见瓶颈与优化方向
- 进程与队列
- 动态进程池:合理设置 pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers;静态池(pm=static)在可控内存下可提升稳定并发上限。
- 结合内存估算:max_children ≈ 可用内存 / 单进程常驻内存(含OPcache/框架开销)。
- 代码与数据层
- 开启并优化 OPcache(生产环境强烈建议),减少文件解析与编译开销。
- 打开并分析 PHP-FPM 慢日志,优化慢SQL、循环与算法复杂度;必要时用 Xdebug/火焰图定位热点。
- Web与网关
- 调整 Nginx worker_processes/worker_connections、keepalive、fastcgi 超时与缓冲,避免过早超时与连接瓶颈;静态资源走缓存/CDN。
- 监控与告警
- 长期接入 Prometheus + Grafana/PHP-FPM Exporter 或 Zabbix,对 RPS、延迟、慢请求、进程利用、错误率设阈值告警。