继“我如何将 strace 附加到不在 ps 输出中的进程?”
我正在尝试调试一个半挂起的进程。
通过strace -f
在我的父进程上使用,我能够确定我有一堆正在显示的线程:
# strace -p 26334
Process 26334 attached - interrupt to quit
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, ^C <unfinished ...>
Process 26334 detached
进一步调查:
# readlink /proc/26334/fd/607
anon_inode:[eventpoll]
我的直觉告诉我,我已经设法让一些线程陷入僵局,但我对epoll
继续前进的了解还不够。是否有任何命令可以让我深入了解这些线程正在轮询的内容,或者此 epoll 描述符映射到哪些文件描述符。
答案1
当您运行strace
这些行时,它返回的是系统函数。如果它不是很明显,epoll_wait()
您可以执行以下操作man epoll_wait
找出实现细节,如下所示:
epoll_wait, epoll_pwait - wait for an I/O event on an epoll file descriptor
的描述epoll
:
epoll API 执行与 poll(2) 类似的任务:监视多个文件描述符以查看其中任何一个是否可以进行 I/O。 epoll API 可以用作边缘触发或级别触发接口,并且可以很好地扩展到大量监视的文件描述符。
因此看起来您的进程正在文件描述符上阻塞,等待查看是否可以在其中任何一个上进行 I/O。
我会稍微改变我的策略,并尝试lsof -p <pid>
看看是否可以缩小这些文件的实际范围。