进程处于可中断睡眠状态 - 如何找出它正在等待什么

Rob*_*rtK 6 linux daemon process

我有一个守护进程在 Arm 上的 Debain 上运行。有时这个守护进程会挂起/不再响应。当使用“ps ax”查看进程时,统计列是“Dl”,这意味着“不间断睡眠(通常是 IO)”。是否可以找到有关进程正在等待的更多详细信息 - 例如哪个 IO 挂起?

谢谢!

use*_*233 3

我对 Jetson Nano(ARMv8,内核架构:aarch64)也有同样的问题,它挂在ptxas命令上。

首先我们需要了解进程处于不可中断睡眠状态是什么意思。阅读本文:什么是不间断过程?和Linux 进程状态。

简而言之:处于不间断睡眠状态的进程只能被它正在等待的内容唤醒。任何信号都无法唤醒它。

要调查发生了什么,您可以检查进程堆栈

cat /proc/<PROCESS_PID>/stack
Run Code Online (Sandbox Code Playgroud)

就我而言是

[nano]<$:~$ sudo cat /proc/6816/stack
[<ffffff80080863bc>] __switch_to+0x9c/0xc0
[<ffffff80081c6fdc>] wait_on_page_bit_killable+0x8c/0x98
[<ffffff80081c7948>] __lock_page_or_retry+0xc0/0xe8
[<ffffff80082029b8>] do_swap_page+0x5d0/0x840
[<ffffff8008204be4>] handle_mm_fault+0x60c/0xa68
[<ffffff80080a36b0>] do_page_fault+0x308/0x518
[<ffffff80080a392c>] do_translation_fault+0x6c/0x80
[<ffffff8008080954>] do_mem_abort+0x54/0xb0
[<ffffff80080833c8>] el0_da+0x20/0x24
[<ffffffffffffffff>] 0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)

我该如何阻止这种情况发生?

这要看具体情况吧 就我而言,我增加了交换大小。

这可能是一个愚蠢的问题,但是有没有办法在不重新启动计算机的情况下中断它?

处于不可中断睡眠状态的进程有时可能会更改为可中断状态,然后再次返回到之前的不可中断状态。所以,你可以尝试

while true; do kill -9 <PROCESS_PID>; done
Run Code Online (Sandbox Code Playgroud)