温馨提示×

如何在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)深入定位。

四 示例测试计划与结果判读

  • 步骤
    1. 预热:运行一次小规模压测(如 n=1000, c=50),排除冷启动影响。
    2. 基线:ab -n 10000 -c 200 记录 RPS、平均/最大延迟、50x比例。
    3. 递增并发:c=400、800(或 wrk -c 400/800),每档至少跑60秒,观察稳定性与错误率。
    4. 长稳压测:选择目标并发(如 c=200),持续10~30分钟,观察内存泄漏、慢日志增长、进程重启(pm.max_requests 触发)。
    5. 峰值边界:继续加压至出现稳定 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 ExporterZabbix,对 RPS、延迟、慢请求、进程利用、错误率设阈值告警。

0