温馨提示×

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
  • 关键信息:
    • 标识与脚本:poolpidscript_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/KCacheGrindBlackfire对可疑URL做函数级剖析,获取更细的执行时间与调用关系
  • 若瓶颈在数据库
    • 开启并分析MySQL慢查询日志(slow_query_log、long_query_time),与PHP-FPM慢日志交叉验证SQL层面的问题。

四 从日志到优化的闭环

  • 常见根因与对策
    • 数据库慢查询:为高频慢SQL建立合适索引、改写查询、引入查询缓存或读写分离
    • 外部HTTP/API调用:设置合理超时与重试、并发控制、结果缓存、考虑异步化
    • 计算/循环密集:优化算法与数据结构、批处理代替逐条处理、利用OPcache加速
    • 配置不当:结合负载调优FPM进程参数(如pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers),避免进程饥饿或过度创建
  • 验证与回归
    • 优化后缩短阈值(如由5s调至1s)复测,观察慢日志数量与P95/P99耗时是否下降,并持续监控。

0