PHP-FPM进程高CPU占用与top命令显示整体CPU偏低的原因分析及调优方向咨询
PHP-FPM进程高CPU占用与top命令显示整体CPU偏低的原因分析及调优方向咨询
兄弟,我来给你捋捋这个事儿——你遇到的这种情况其实挺常见的,咱们先把原因搞清楚,再聊调优的思路:
为啥会出现这种矛盾情况?
- 单进程占满单个核心,整体CPU仍有空闲:top里的
%CPU列是单个进程占用单个CPU核心的比例,不是服务器总CPU的比例。比如你的服务器是8核,一个php-fpm进程占100%(把一个核心跑满),那整体CPU使用率才12.5%,看起来自然很低。你可以在top界面按1键切换到单核心视图,就能看到那个被占满的核心,其他核心都处于空闲状态。 - 高CPU进程是短生命周期的“瞬态进程”:有些php-fpm进程刚启动就把CPU拉满,但很快就处理完请求退出了,top默认的刷新频率(一般1-3秒)可能刚好错过它的峰值,但你查看进程列表时又能看到它的高CPU记录。这种情况可以用命令
top -b -n 10批量输出10次top结果,就能捕捉到那些一闪而过的高CPU进程。 - top的统计维度容易误导:top默认显示的
%CPU是进程在最近一个刷新周期内的瞬时CPU使用率,如果你的php-fpm进程是间歇性爆发高CPU(比如每隔几秒跑一次高负载任务),刚好在top刷新的那个瞬间它没在干活,就会显示整体CPU偏低,但你看到的进程高CPU是它之前的峰值记录。
该从哪里开始调优?
- 先搞清楚php-fpm到底在忙啥:
- 用
strace -p <你的php-fpm进程ID>跟踪高CPU进程,看看它是在疯狂执行系统调用、读写文件,还是卡死在某个逻辑里。 - 开启php-fpm的慢日志:在php-fpm的配置文件里把
request_slowlog_timeout设小一点(比如5秒),slowlog指定日志路径,这样超过时长的请求会被记录下来,你就能找到那些耗CPU的慢请求。
- 用
- 调整php-fpm进程池配置:
- 先确认你的进程管理模式:
static、dynamic还是ondemand。如果是dynamic,检查pm.max_children(最大进程数)别设得太大,避免进程过多导致上下文切换开销;也别太小,不然请求排队。pm.start_servers、pm.min_spare_servers和pm.max_spare_servers要根据你的请求量调整,保证空闲进程数合理。 - 如果是单个php-fpm进程持续占满CPU,那大概率是单个请求的代码有问题,这时候优先优化代码比调进程数更有效。
- 先确认你的进程管理模式:
- 排查PHP代码的性能瓶颈:
- 检查有没有无限循环、大量重复的字符串拼接、复杂正则表达式滥用,或者重复查询数据库的情况。
- 用性能分析工具(比如Xdebug、Tideways)对代码进行采样,找到CPU占用高的函数或代码块,针对性优化。
- 系统层面的小检查:看看是不是CPU核心被绑定了?比如php-fpm进程被限制只能跑在某一个核心上,导致单个核心满负荷,但其他核心空闲,整体CPU使用率看起来就低。可以用
taskset -p <进程ID>查看进程的核心绑定情况。
备注:内容来源于stack exchange,提问作者Emad Ha
相关产品推荐
相关产品推荐

