首页主机资讯Linux下PHP-FPM慢日志如何分析

Linux下PHP-FPM慢日志如何分析

时间2025-11-28 23:17:05发布访客分类主机资讯浏览901
导读:Linux下PHP-FPM慢日志分析实操指南 一 前置准备与确认 开启慢日志(示例为 www.conf): 设置慢日志路径与阈值:slowlog = /var/log/php-fpm/www-slow.log、request_slowl...

Linux下PHP-FPM慢日志分析实操指南

一 前置准备与确认

  • 开启慢日志(示例为 www.conf):
    • 设置慢日志路径与阈值:slowlog = /var/log/php-fpm/www-slow.logrequest_slowlog_timeout = 1s(单位支持 s/ms,如 1000ms)。
    • 重启使其生效:systemctl restart php-fpm(或按实际版本执行如:php7.4-fpm、php8.1-fpm)。
  • 确认日志生效与落盘:
    • 实时观察:tail -f /var/log/php-fpm/www-slow.log
    • 触发一次慢请求(如脚本中 sleep(2)),确认日志出现包含 script_filename 与具体函数栈的条目。
  • 注意区分:PHP-FPM 慢日志与 MySQL 慢查询日志不同,后者在数据库层配置(如 slow_query_loglong_query_time),不要混淆。

二 日志结构与关键信息

  • 典型慢日志条目包含:
    • 请求基本信息:[pool www] pid 12345script_filename = /var/www/html/index.php
    • 调用栈与定位:[0x…] 函数名() /path/file.php:行号,可精确到函数与代码行。
    • 示例:
      [26-Oct-2023 15:30:45]  [pool www] pid 12345
      script_filename = /var/www/html/index.php
      [0x00007f8b8c0c8000] curl_exec() /var/www/html/api.php:45
      [0x00007f8b8c0c8100] api_call() /var/www/html/index.php:23
      
  • 解读要点:
    • 先定位到具体的 PHP 文件与行号,再查看相邻栈帧,判断是 数据库、外部API、文件IO、锁竞争 等导致的阻塞。

三 常用分析命令与用法

  • 实时观察新增慢请求:
    • tail -f /var/log/php-fpm/www-slow.log
  • 按脚本汇总“最慢TopN”:
    • 思路:提取 script_filename,按平均/最大耗时排序(需脚本解析时间戳或请求时长字段,见下文进阶)。
  • 按函数/文件聚合热点:
    • 提取函数与文件:grep -o ‘[0x[0-9a-f]] [^(]([^)]*) /var/log/php-fpm/www-slow.log’ | sort | uniq -c | sort -nr | head
  • 快速过滤某脚本的慢记录:
    • grep ‘script_filename = /var/www/html/index.php’ /var/log/php-fpm/www-slow.log
  • 若慢日志同时记录了请求耗时(如在 access.format 中启用 %{ mili} d),可用 awk 做统计与排序(示例思路):
    • 按脚本平均耗时排序:awk -F’|’ ‘{ split($NF,t,“:”); ms=t[2]; sum[NR]=$1; cnt[NR]++; s+=$1} END{ for(i in sum) printf “%.2fms\t%s\n”, s/cnt[i], sum[i]} ’ access.log | sort -nr | head
  • 数据库慢 SQL 的进一步分析(如应用把 SQL 写到 PHP 日志或使用了数据库慢日志):
    • 使用 pt-query-digest 对 MySQL 慢日志做聚合与诊断:pt-query-digest /var/log/mysql/slow.log

四 进阶定位与性能瓶颈排查

  • 进程卡住或疑似“假死”时:
    • strace 跟踪系统调用:strace -p -f -e trace=all,观察是否长时间阻塞在 connect()/read()/write()/poll/epoll_wait 等。
    • gdb 查看调用栈(更适合测试环境):gdb -p → bt / info threads / thread apply all bt
  • CPU 高占用或热点函数定位:
    • 使用 perf 采样:perf record -p -g – sleep 30,然后 perf report 查看函数级热点。
  • 与系统资源联动排查:
    • 结合 free -h(内存)、iostat -x 1(磁盘IO)判断是否存在资源瓶颈放大了 PHP 层的慢请求。

五 优化与预防建议

  • 外部依赖必须设置超时:
    • 数据库(如 PDO):设置 ATTR_TIMEOUT、合理的 wait_timeout;连接池/复用减少频繁建连。
    • HTTP 调用(如 curl):设置 CURLOPT_TIMEOUTCURLOPT_CONNECTTIMEOUT,避免下游故障拖死 PHP 进程。
  • 减少锁竞争与阻塞:
    • 文件锁使用 flock 时增加 超时/非阻塞 策略,避免进程无限等待。
  • 建立常态化监控与复盘:
    • 持续观察慢日志,配合 access.log 做访问画像;优化后回归验证并保留基线指标。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Linux下PHP-FPM慢日志如何分析
本文地址: https://pptw.com/jishu/759562.html
如何监控Linux上的PHP-FPM进程 Ubuntu LNMP如何实现日志轮转

游客 回复需填写必要信息