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。
解决办法
- 注释或删除 php-fpm.conf 中的慢日志配置:
;request_slowlog_timeout = 5s ;slowlog = /var/log/php/newsoul_cn.slow.log - 用 php.ini 的
max_execution_time兜底,确保慢脚本最终会被超时杀死,而不是直接卡死 worker。
补充说明
慢日志本身是排查性能问题的好工具。如果确实要保留慢日志,建议先升级 PHP/PHP-FPM 到较新版本(旧版 ptrace 回溯存在已知问题),并确认运行环境允许 ptrace 系统调用(容器需开启相应 capability)。