PHP5-FPM 出现 I/O 错误,ptrace(PEEKDATA)失败

PHP5-FPM 出现 I/O 错误,ptrace(PEEKDATA)失败

我有很多这样的:

[NOTICE] child 19214 stopped for tracing 
[NOTICE] about to trace 19214 
[ERROR] ptrace(PEEKDATA) failed: Input/output error (5) 
[NOTICE] finished trace of 19214 
[WARNING] [pool www] child 19208, script 'blahblah.php' executing too slow (30.041419 sec), logging 
[NOTICE] child 19208 stopped for tracing 
[NOTICE] about to trace 19208 
[ERROR] ptrace(PEEKDATA) failed: Input/output error (5) 
[NOTICE] finished trace of 19208 
[WARNING] [pool www] child 19218, script 'blahblah.php' executing too slow (30.035029 sec), logging 

当 php 达到最大子节点数时(至少我认为是这种情况)它就会停止“工作”...现在我知道我可以增加 max_children(当前设置为 9)但是有没有办法阻止 php“死亡”?

我使用的是 1 核、512 MB RAM 的 VPS(PHP5-FPM 5.4.4 + APC 3.1.10)。


禁用慢速日志后我现在得到:

WARNING: [pool www] child 1684 exited on signal 15 (SIGTERM) after 77.802376 seconds from start
NOTICE:  [pool www] child 1694 started
WARNING: [pool www] child 1377, script 'blahblah.php' (request: "GET /blahblah.php") execution timed out (38.291440 sec), terminating
WARNING: [pool www] child 1377 exited on signal 15 (SIGTERM) after 2750.295279 seconds from start
NOTICE:  [pool www] child 1696 started
WARNING: [pool www] child 1722, script 'blahblah.php' (request: "POST /blahblah.php") execution timed out (39.653910 sec), terminating
WARNING: [pool www] child 1722 exited on signal 15 (SIGTERM) after 793.953090 seconds from start

我认为这些脚本这么慢是不正常的。您建议使用 max_execution_time 吗?

答案1

看来你有request_slowlog_timeout已启用。这通常会处理任何超过 N 秒的请求,记录它花费了很长时间,然后记录脚本的堆栈跟踪,以便您可以看到它正在做什么,导致花费这么长时间。

就您而言,堆栈跟踪(用于确定脚本正在执行的操作)失败。如果您的进程用尽,则可能是因为:

  1. php-fpm 停止进程进行跟踪后,由于跟踪过程中出现错误,导致进程无法恢复
  2. 该过程正在恢复但会一直运行。

我的第一个猜测是禁用 request_slowlog_timeout。由于它不能正常工作,因此可能弊大于利。如果这不能解决进程耗尽的问题,那么请将 php.ini 设置为max_execution_time可以终止脚本的某个值。

答案2

更有效的解释ptrace(PEEKDATA)失败似乎是这样的 -

... 当主进程确定执行缓慢时,工作进程可以自由运行。当停止跟踪时,它可能已经完成了该执行,并且处于为另一个请求提供服务的任何阶段,因此跟踪器有失败或更糟的机会,转储不相关执行的堆栈。

FPM Slowlog 很烂它更详细地解释了整个混乱局面。

相关内容