web服务器 技术随笔

php日志分析:解决NGINX+PHP-FPM failed to ptrace(PEEKDATA) Input/output error出错问题

问题现象

Nginx + PHP-FPM 架构下,网站偶发 502(Bad Gateway)。查看 PHP-FPM 错误日志(error_log)发现大量:

[29-Mar-2014 22:40:10] ERROR: failed to ptrace(PEEKDATA) pid 4276: Input/output error (5)
[29-Mar-2014 22:53:54] ERROR: failed to ptrace(PEEKDATA) pid 4319: Input/output error (5)

根本原因

开启了 PHP-FPM 的慢日志(slow log)相关配置:

request_slowlog_timeout = 5s
slowlog = /var/log/php/newsoul_cn.slow.log

当某个请求超过 request_slowlog_timeout 时,PHP-FPM 会暂停该 worker 进程并对它做栈回溯(ptrace PEEKDATA)以记录慢调用堆栈。若回溯过程本身失败(常见于容器/受限环境、进程状态异常),就会抛出上述 I/O error。严重时 worker 无法恢复,进程被耗尽,进而出现 502。

解决办法

  1. 注释或删除 php-fpm.conf 中的慢日志配置:
    ;request_slowlog_timeout = 5s
;slowlog = /var/log/php/newsoul_cn.slow.log
  2. 用 php.ini 的 max_execution_time 兜底,确保慢脚本最终会被超时杀死,而不是直接卡死 worker。

补充说明

慢日志本身是排查性能问题的好工具。如果确实要保留慢日志,建议先升级 PHP/PHP-FPM 到较新版本(旧版 ptrace 回溯存在已知问题),并确认运行环境允许 ptrace 系统调用(容器需开启相应 capability)。

标签
phpphp-fpm