Php-fpm CPU占用随时间异常升高问题求助
问题:PHP-FPM进程CPU占用随时间逐步升高,仅重启虚拟机可解决
环境配置
- 虚拟机:Ubuntu 18.04.3 LTS(搭载VM Ware vSphere Hypervisor),配置16核(2GHz)、16GB内存
- 服务栈:Apache 2.4.29 + PHP-FPM 7.2 + Memcached
- MySQL:5.7部署在独立服务器
- PHP-FPM核心配置(存在过度分配):
pm = dynamic pm.max_children = 256 pm.start_servers = 110 pm.min_spare_servers = 32 pm.max_spare_servers = 150
- 内存占用:最高从未超过15%(约2.5GB)
异常现象
- 业务量稳定(日连接用户数、每分钟请求量无波动),但全局CPU占用随时间逐步攀升,消耗主体为PHP-FPM进程
- 3-4天内触发告警:第一天CPU占用低于40%,次日上升10%-20%,第三或第四天突破100%(最高达150%),服务器不可用,vSphere仪表盘触发大量告警
- PHP-FPM进程数始终维持在约450个,无僵尸进程,无内存泄漏(活跃内存占用始终低于15%)
- 单独重启PHP-FPM、Apache、Memcached均无法缓解,仅重启虚拟机可恢复正常
已排查内容
- MySQL:响应速度正常,所在虚拟机CPU占用始终低于30%,排除数据库瓶颈
- 日志:Apache访问/错误日志、PHP-FPM日志、系统日志(syslog、messages)均无异常记录,无DDoS攻击、请求过载迹象,请求路由未发生变化
- 系统与服务:未更新操作系统、未修改PHP源码,VMware Tools已更新至最新版本
- 宿主机:托管服务商确认宿主机节点无资源竞争或硬件故障
排查建议
- 跟踪PHP-FPM进程CPU细节:使用
pidstat -u -t -p <php-fpm主进程PID> 60定期采样,记录每个子进程的CPU占用变化,确认是特定进程持续高占用,还是整体进程组缓慢攀升 - 排查PHP扩展潜在问题:用
php -m列出所有加载的扩展,临时禁用非核心扩展(如自定义扩展、第三方工具类扩展),观察CPU变化是否缓解 - 调整PHP-FPM进程回收策略:在配置中添加
pm.max_requests = 1000(可根据业务请求量调整),让子进程处理一定请求后自动重启,避免长期运行积累未知问题 - 检查虚拟机CPU调度状态:在vSphere控制台查看虚拟机的CPU就绪时间,若就绪时间过高,可能存在宿主机CPU资源隐性竞争(即使服务商排查无问题,需自行验证)
- 优化OPcache配置:确保OPcache已启用,配置合理的缓存参数(如
opcache.enable=1、opcache.revalidate_freq=60),避免重复编译PHP脚本导致CPU额外消耗 - 抓取PHP进程调用栈:当CPU升高时,用
pstack <高CPU占用的PHP-FPM子进程PID>获取调用栈,定位具体执行的代码逻辑,排查是否存在死循环或低效逻辑 - 检查系统资源限制:执行
ulimit -a查看文件描述符、进程数等限制,确认是否存在隐性资源耗尽导致的CPU异常调度 - 升级PHP版本:PHP 7.2存在部分已知的性能bug,尝试升级至7.2的最新补丁版本,或直接升级到7.4稳定版,验证问题是否消失
内容的提问来源于stack exchange,提问作者Sbraaa
相关产品推荐
相关产品推荐

