查找永久阻塞 I/O 的原因(进程处于不间断睡眠状态)

查找永久阻塞 I/O 的原因(进程处于不间断睡眠状态)

在Linux下,我有一个进程被阻塞在不间断睡眠(状态D)。我该如何调查造成这种情况的原因?

我正在运行一个“普通”内核(Debian 版本),没有任何特殊的调试功能。

没有相关的日志条目——事实上,从进程启动到我注意到它的时间之间没有任何记录。

strace甚至无法附加到该进程,因为它处于不间断睡眠状态。即使我知道系统调用的名称,也不一定对我有帮助。我需要知道内核内部发生了什么。

具体来说,该sync命令进入不间断睡眠:(所以我一定在某个地方出现了 I/O 问题,但我的所有文件系统似乎都正常工作。很可能有一个关于 I/O 错误的旧日志条目,但我找不到它(这台机器已经很长时间没有重新启动了,有很多日志条目)。我至少可以知道哪个子系统正在阻塞吗sync?例如,获取与特定 PID/TID 相对应的内核线程的内核回溯?

(我确信重新启动可以解决此问题或揭示错误,但我问的是如何调查此问题,而不是如何盲目地按下按钮。)

答案1

虽然有点晚了,但对其他人可能会有帮助。

我做了什么:

  1. cat /proc/PID/stack以获得一些方向。就我而言,它与索引节点和文件系统:
[<ffffffff83bbd6f1>] wait_on_page_bit+0x81/0xa0            
[<ffffffff83bced9b>] truncate_inode_pages_range+0x42b/0x750
[<ffffffff83bcf12f>] truncate_inode_pages_final+0x4f/0x60  
[<ffffffff83c6b78c>] evict+0x16c/0x180                     
[<ffffffff83c6bafc>] iput+0xfc/0x190                       
[<ffffffff83c66498>] __dentry_kill+0x158/0x1d0             
[<ffffffff83c66b35>] dput+0xb5/0x1a0                       
[<ffffffff83c4f53d>] __fput+0x18d/0x230                    
[<ffffffff83c4f6ce>] ____fput+0xe/0x10                     
[<ffffffff83ac31cb>] task_work_run+0xbb/0xe0               
[<ffffffff83a2cc65>] do_notify_resume+0xa5/0xc0            
[<ffffffff8419322f>] int_signal+0x12/0x17                  
[<ffffffffffffffff>] 0xffffffffffffffff                    
  1. cat /proc/PID/syscall获取当前系统调用:
3 0x6 0x1ae4bc6d 0x1 0x559320c 0x801df5 0x60161c4e 0x7ffccee38ae0 0x7fcf1a1547bd

3代表关闭系统调用,6 是文件描述符(系统调用的第一个参数)。它正试图打电话close(6)

  1. lsof -p PID,但没有我的描述符。
  2. 如果您很幸运并且您的文件在应用程序启动时的某个位置打开,您可以启动它的另一个实例并通过检查该文件lsof。这是我的情况。

祝你好运

相关内容