Ubuntu中PHP-FPM的慢日志怎么分析
小樊
33
2025-11-30 18:02:51
Ubuntu下PHP-FPM慢日志分析与排查
一 启用与确认慢日志
- 编辑对应池配置(常见路径:/etc/php/{version}/fpm/pool.d/www.conf),开启慢日志并设置阈值:
- 示例:
- slowlog = /var/log/php-fpm/www-slow.log
- request_slowlog_timeout = 1s
- 重启使配置生效(按你的PHP版本调整服务名):
- sudo systemctl restart php8.1-fpm
- 确认慢日志已生成并持续写入:
- tail -f /var/log/php-fpm/www-slow.log
- 注意:不要与MySQL的慢查询日志混淆。PHP-FPM慢日志由FPM记录脚本执行轨迹;MySQL慢查询需在数据库侧单独开启。以上路径与步骤适用于Ubuntu上常见的PHP-FPM部署。
二 读懂慢日志条目
- 典型慢日志片段:
- [pool www] pid 6368
- script_filename = /data/wwwroot/aminglinux.cc/test.php
- [0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3
- 关键信息:
- 标识与脚本:pool、pid、script_filename
- 调用栈与位置:以**[0x…] 函数名 文件:行号**形式展示,能直接定位到慢的具体函数与代码行
- 用途:快速判断是外部调用(如数据库、HTTP)、计算密集,还是I/O阻塞,从而决定优化方向。
三 常用分析方法与命令
- 实时观察新增慢请求
- tail -f /var/log/php-fpm/www-slow.log
- 按脚本汇总“最慢Top N”
- awk ‘/script_filename/ {print $3}’ /var/log/php-fpm/www-slow.log | sort | uniq -c | sort -nr | head
- 统计调用栈出现频次(定位热点函数/文件)
- grep -o ‘[0x[0-9a-f]] [^ ]’ /var/log/php-fpm/www-slow.log | sort | uniq -c | sort -nr | head
- 结合系统资源排查阻塞
- top/htop(CPU/内存)、netstat/ss(连接/端口)、必要时配合FPM状态页(若启用pm.status_path)观察进程与排队情况
- 深入剖析单次慢请求
- 使用Xdebug + Webgrind/KCacheGrind或Blackfire对可疑URL做函数级剖析,获取更细的执行时间与调用关系
- 若瓶颈在数据库
- 开启并分析MySQL慢查询日志(slow_query_log、long_query_time),与PHP-FPM慢日志交叉验证SQL层面的问题。
四 从日志到优化的闭环
- 常见根因与对策
- 数据库慢查询:为高频慢SQL建立合适索引、改写查询、引入查询缓存或读写分离
- 外部HTTP/API调用:设置合理超时与重试、并发控制、结果缓存、考虑异步化
- 计算/循环密集:优化算法与数据结构、批处理代替逐条处理、利用OPcache加速
- 配置不当:结合负载调优FPM进程参数(如pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers),避免进程饥饿或过度创建
- 验证与回归
- 优化后缩短阈值(如由5s调至1s)复测,观察慢日志数量与P95/P99耗时是否下降,并持续监控。