Linux下PHP-FPM慢日志如何分析
导读: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.log、request_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_log、long_query_time),不要混淆。
二 日志结构与关键信息
- 典型慢日志条目包含:
- 请求基本信息:[pool www] pid 12345、script_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_TIMEOUT、CURLOPT_CONNECTTIMEOUT,避免下游故障拖死 PHP 进程。
- 减少锁竞争与阻塞:
- 文件锁使用 flock 时增加 超时/非阻塞 策略,避免进程无限等待。
- 建立常态化监控与复盘:
- 持续观察慢日志,配合 access.log 做访问画像;优化后回归验证并保留基线指标。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux下PHP-FPM慢日志如何分析
本文地址: https://pptw.com/jishu/759562.html
