You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:37:39