我在 Nginx 后面以 PHP-FPM 的形式运行 PHP。偶尔其中一个池会停止响应请求。似乎 nginx 正在接受连接,并将其传递给 PHP-FPM,但 PHP-FPM 却没有给出响应。该池的所有请求都会发生这种情况,包括那些通常应该运行得非常快的请求。
我已为慢速 PHP-FPM 启用日志记录。通常,这会提供在达到慢速日志时间时调用了哪些函数的堆栈跟踪,但在慢速日志中我看到:
[08-Jun-2014 16:40:49] [pool imagick] pid 16825
script_filename = /home/github/imagick-demos//imagick/index.php
[0x00007fa70269c1c8] +++ dump failed
在 PHP-FPM 日志中我看到:
WARNING: [pool imagick] child 17502, script '/home/github/imagick-demos//imagick/index.php' (request: "GET /index.php") executing too slow (10.459610 sec), logging
NOTICE: child 17502 stopped for tracing
NOTICE: about to trace 17502
ERROR: failed to ptrace(PEEKDATA) pid 17502: Input/output error (5)
NOTICE: finished trace of 17502
即,导致速度缓慢的原因的追踪失败了。
其他 PHP-FPM 池响应良好。奇怪的是,仅重新启动 PHP-FPM 似乎无法解决这个问题。然而,当它刚刚发生时,我做了以下事情:
- 多次重新启动 PHP-FPM 但没有效果。
- 禁用Xdebug和OPCache,并重新启动PHP-FPM。
- 重新启用Xdebug和OPCache,并重新启动PHP-FPM。
此后,池开始再次正常响应。我用 strace 监控 PHP-FPM,那里没有任何明显的阻塞或故障。
什么原因导致 PHP-FPM 出现这样的阻塞?