Laravel 11偶发CPU高占用及Bootstrap耗时增加问题排查求助
Laravel 11 偶发PHP-FPM CPU占满、Bootstrap耗时飙升排查思路
基础信息
服务器配置
- 32核CPU
- 128GB内存
- SSD存储
- Nginx + PHP-FPM(进程数限制为20)
流量情况
- 日均400万请求(均匀分布)
- 服务器平均负载约10%
问题现象
正常状态下性能优异,但会无征兆出现单个/多个PHP-FPM进程CPU占用飙升至100%的情况,导致应用响应大幅变慢。该状态持续数小时后自行恢复,期间无流量波动或外部环境变化。
已排查进展
使用Tideways分析发现,高负载期间核心差异为Laravel Bootstrap阶段耗时显著增加(对应Tideways面板中的浅蓝色条形),暂未定位到明确触发因素。
可能原因与排查建议
1. 缓存相关问题
Laravel Bootstrap阶段大量依赖缓存(配置缓存、路由缓存、视图缓存等),缓存失效或读取异常会导致重复编译/解析,拉高CPU占用:
- 检查
bootstrap/cache目录及文件的读写权限,对比正常与异常时段的缓存文件访问日志,确认是否存在进程无法读取缓存的情况 - 监控缓存命中率,排查是否存在缓存被意外清除(如部署脚本误操作、磁盘空间不足导致缓存写入失败)
- 异常时段手动执行
php artisan config:cache、php artisan route:cache,观察是否能缓解症状
2. 依赖包自动加载异常
Composer自动加载缓存损坏或未优化,会导致PHP反复扫描文件:
- 检查
vendor/composer/autoload_*.php文件在异常时段是否有变更或大小异常 - 异常时执行
composer dump-autoload -o重新生成优化后的自动加载文件,对比性能变化 - 排查是否有第三方依赖包在运行时修改自动加载规则
3. 环境变量读取阻塞
Laravel Bootstrap会加载环境变量,若依赖远程配置中心或系统环境变量加载异常,会引发阻塞:
- 检查是否使用远程配置服务(如Vault),异常时段查看该服务的可用性及响应延迟
- 尝试将环境变量写入系统全局配置(而非
.env文件),观察问题是否复现 - 监控
getenv()/env()函数的调用耗时,确认是否是环境变量读取导致的延迟
4. PHP-FPM进程状态异常
进程长时间运行可能出现内存泄漏、状态损坏:
- 配置PHP-FPM的
pm.max_requests参数(如设为1000),让进程处理一定请求数后自动重启 - 异常时段用
ps aux定位CPU占满的进程ID,再执行strace -p <PID>跟踪系统调用,查看是否卡在文件读取或系统调用环节 - 检查
php-fpm.log,是否有进程崩溃、重启的记录
5. 文件系统/磁盘IO异常
即使是SSD,临时IO阻塞或文件系统错误也会影响Bootstrap阶段的文件读取:
- 异常时段执行
iostat -x 1查看磁盘IO指标,确认是否有IO使用率飙升、读写延迟增加的情况 - 检查系统日志(
/var/log/messages或dmesg),是否有磁盘相关错误信息 - 测试
bootstrap/cache、vendor目录下文件的读取速度,对比正常与异常时段的差异
6. Laravel服务提供者初始化阻塞
Bootstrap阶段会加载所有服务提供者的register/boot方法,若某个服务提供者初始化时阻塞:
- 逐个注释
config/app.php中的非核心服务提供者,观察问题是否消失 - 在核心服务提供者的
register/boot方法中添加耗时日志,异常时段排查哪个服务提供者初始化耗时突增 - 检查服务提供者是否依赖外部资源(如数据库、Redis),异常时这些资源是否存在连接超时或响应延迟
内容的提问来源于stack exchange,提问作者Iceman
相关产品推荐
相关产品推荐

