描述 `strace` 命令输出

ibe*_*ski 4 linux php debugging

我有 php 进程无法完成超过 2 天。

root     26511  0.0  1.6 407788 27684 ?        Ss   Jul09   0:08 /usr/bin/php action.php
Run Code Online (Sandbox Code Playgroud)

这是 strace 命令的输出:

poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {5533745, 664851437}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533745, 664940247}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533745, 665211013}) = 0
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {5533746, 666594416}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533746, 666684149}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533746, 666772214}) = 0
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {5533747, 668356163}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533747, 668447565}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533747, 668538577}) = 0
Run Code Online (Sandbox Code Playgroud)

你能解释一下这个输出是什么意思吗?或者,也许我可以使用其他一些命令获取有关堆栈进程的更多信息。

PHP 版本:PHP 5.4.30 CentOS 6.5 版

HBr*_*ijn 10

strace命令列出了应用程序在运行时进行的系统调用。

如果您不是开发人员:系统手册的第 2 部分记录了系统调用,帮助您了解正在发生的事情。

man 2 poll

DESCRIPTION
   poll()  performs a similar task to select(2): it waits for one of a set
   of file descriptors to become ready to perform I/O.
Run Code Online (Sandbox Code Playgroud)

poll 系统调用中请求的事件都与文件描述符 7 上的读取相关,同样从手册页中,您的应用程序请求的事件是:

POLLIN     There is data to read.
POLLPRI    There is urgent data to read. 
POLLRDNORM Equivalent to POLLIN.
POLLRDBAND Priority band data  can  be  read  (generally  unused  on Linux).
Run Code Online (Sandbox Code Playgroud)

strace 行显示轮询操作超时,文件描述符 (#7) 未准备好读取 IO。

系统调用clock_gettime() - clock and time functions表示等待一段时间然后再试一次。

要找出导致超时的文件,应该有数字 7 的符号链接,代表文件的整数 /proc/<PID>/fd/7