PHP-FPM 的性能测试,最怕只盯着一组压测数字下结论。吞吐量高不一定代表配置合理,响应时间波动大、慢请求堆积、CPU 或内存被打满,往往都要结合运行时数据一起判断。
这篇文章按实际排查顺序,整理一套在 Linux 上测试 PHP-FPM 的常用方法:先把状态页和慢日志准备好,再用压测工具制造负载,同时观察系统资源,最后回到慢日志、Profiler 和配置参数里定位瓶颈。读完后,你可以判断问题更可能出在并发能力、进程参数、代码热点,还是底层资源上。
先把观测能力补齐:状态页面与慢日志
在正式压测前,建议先把基础观测项打开。PHP-FPM 自带的状态页面和慢日志,能在测试过程中直接暴露请求堆积、执行过慢和进程异常等问题。

启用 PHP-FPM 状态页面
找到 PHP-FPM 的池配置文件,通常位于 /etc/php/{version}/fpm/pool.d/www.conf,取消 pm.status_path 的注释,例如:
pm.status_path = /status
接着确保 Web 服务器可以访问这个路径。以 Nginx 为例,需要添加对应的 location /status 配置,并转发到 PHP-FPM 的 socket。完成后重启 PHP-FPM 服务,状态页面才会生效。
这个页面的价值在于,压测过程中可以直接看到进程池的处理状态,帮助判断是不是 PHP-FPM 本身已经接近瓶颈。
配置慢日志,给后续分析留证据
同样在这个池配置文件里,设置 request_slowlog_timeout 和 slowlog:
request_slowlog_timeout = 1s
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 1s 表示执行时间超过 1 秒的请求会被记录,slowlog = /var/log/php-fpm/slow.log 用来指定日志路径。重启后,超时请求就会写入该文件。
这一步很重要,因为很多性能问题在压测结果里只表现为响应时间变慢,但真正的原因,通常要靠慢日志去定位到具体脚本和执行路径。
如何模拟负载:ab、wrk 和 JMeter 怎么选
准备工作做完后,就可以开始制造并发请求。不同工具适合的场景不一样,选对工具,测试结果才更接近你想验证的问题。

ab:适合快速基准测试
ApacheBench(ab)是 Linux 上非常常见的轻量级工具,适合先跑一轮基础数据。安装命令:
sudo apt install apache2-utils
基本用法:
ab -n 100 -c 10 http://your_server_ip/info.php
其中,-n 是总请求数,-c 是并发数。输出结果里,Requests per second 代表吞吐量,Time per request 代表响应速度,这两个指标最值得优先关注。
如果只是想先确认某个接口在小规模并发下的表现,ab 足够直接。
wrk:更适合高并发和多线程压测
当你需要更高压力、更长时间或多线程测试时,wrk 通常更合适。安装命令:
sudo apt install wrk
示例命令:
wrk -t12 -c400 -d30s http://your_server_ip/info.php
这里 -t 表示线程数,-c 表示并发连接数,-d 表示测试时长。结果中的 Requests/sec 和 Latency 是最核心的两项。
如果你想观察 PHP-FPM 在较高并发下的承载上限,wrk 比 ab 更有代表性。
JMeter:适合复杂业务流程
当测试目标不只是单个页面,而是登录、表单提交、多个 HTTP 请求串联的真实用户流程时,JMeter 会更实用。它是图形化工具,可以组合多个请求,并通过“聚合报告”监听器查看响应时间、吞吐量等详细结果。
换句话说,ab 和 wrk 更偏基准测试,JMeter 更偏业务场景验证。
压测时要盯哪些资源与进程指标
压测本身只是手段,真正有判断价值的是压测过程中系统和 PHP-FPM 的表现。否则即使拿到吞吐量数字,也很难解释瓶颈到底出在哪里。
命令行工具先看 CPU、内存和队列长度
top 或 htop 可以实时观察进程的 CPU 和内存使用率。在 top 中按 P 键,在 htop 中按 M 键,可以快速定位最占资源的 PHP-FPM 进程。
想看更具体的进程信息,可以执行:
ps aux | grep php-fpm
如果怀疑内存不足或 swap 频繁,可以执行:
free -h
如果想持续看系统统计信息,则可以用:
vmstat 1
其中需要特别留意 r 列,也就是运行队列长度。如果它持续大于 CPU 核心数,通常说明 CPU 已经成为瓶颈。
长期趋势可以交给 Prometheus、Grafana 和 APM
如果测试不是一次性的,而是希望持续观察趋势,Prometheus + Grafana 会更合适。Prometheus 负责采集 PHP-FPM 的指标,例如进程数、请求处理时间、慢请求数等;Grafana 则负责把这些数据做成 dashboard,并支持告警。
对于团队协作或生产环境排查,New Relic、Datadog 这类商业 APM 工具也很常见。它们可以把 Web 服务器、PHP-FPM、数据库等链路串起来,帮助识别慢查询和热点代码。
慢请求和热点代码该怎么分析
当压测结果开始变差时,下一步不是急着改参数,而是先确认到底是哪些请求慢、哪些函数耗时、哪些操作把 CPU 吃满了。
先从慢日志里找问题请求
最直接的方式是实时查看慢日志:
tail -f /var/log/php-fpm/slow.log
日志中通常会包含脚本路径、执行时间、数据库查询等关键信息。通过这些内容,可以快速判断是某个 PHP 脚本拖慢了整体响应,还是某条数据库查询正在放大延迟。
需要更深分析时再上 Profiler
Xdebug 可以生成调用图,展示每个函数的执行时间和调用次数。做法是在 php.ini 中启用:
xdebug.mode=profile
之后可以配合 IDE,例如 PHPStorm,查看分析结果。
Blackfire 是更偏云端的性能分析工具,不需要改业务代码太多,就能收集性能数据,并生成交互式火焰图或时间线。对于定位函数级热点,它通常比单看日志更直观。
如果怀疑问题来自 CPU 密集型操作,还可以使用 Linux 内核的 perf 工具,观察 CPU 使用率和 IPC(Instructions Per Cycle),识别循环过多或算法复杂度过高的函数。
优化参数后为什么一定要复测
找到瓶颈后,才进入真正的优化阶段。这里既包括 PHP-FPM 自身的参数,也包括缓存和代码实现方式。关键点在于,每做完一轮修改,都要回到同样的测试方法再跑一遍,才能确认优化是否真的有效。

优先调整 PHP-FPM 进程池参数
pm.max_children 需要结合服务器内存来算。比如单个 PHP-FPM 进程占用 100MB,那么 2GB 内存的服务器通常可以把它设到 20 左右,避免开太多子进程把内存耗尽。
pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 也要根据并发特征调整,例如 5、3、10 这样的组合,可以让系统在突发流量到来时保留足够的空闲进程。
pm.max_requests 则用于限制每个子进程处理的最大请求数,例如设置为 1000,可以在一定程度上避免内存泄漏长期累积。
别忽略 OPcache
另一个很常见的优化项是启用 OPcache。编辑 php.ini,设置:
opcache.enable=1
opcache.memory_consumption=64
这样可以缓存预编译后的字节码,减少重复编译带来的开销,对 PHP 应用的整体响应通常都有帮助。
代码层优化要围绕热点路径展开
如果慢点已经落到业务代码层,就要优先处理热点路径,例如减少数据库查询次数、使用 Redis 或 Memcached 做缓存、避免在循环中执行耗时文件 IO,以及改用更高效的算法。
文中提到的一个例子是,用 + 运算符代替 array_merge。这类优化虽然看起来细小,但在高频路径里会被放大。
每轮优化后都要回到同一套基准
无论调整的是 PHP-FPM 参数、OPcache,还是应用代码,优化完成后都应该重新跑同一组压力测试,对比前后的 Requests per second、Time per request、Requests/sec、Latency 以及慢日志数量变化。
只有这样,才能确认性能提升是真实存在的,而不是由测试条件变化或偶然波动造成的。













