为什么当有许多进程处于“D”状态时系统会出现“挂起”的情况?

为什么当有许多进程处于“D”状态时系统会出现“挂起”的情况?

我注意到,在 (Linux) 系统上,如果有许多进程处于“D”(不可中断)状态,系统就会开始“挂起”。D 状态主要是由于进程正在等待 I/O。

我所说的“挂起”是指,我无法在控制台上输入命令,或者启动新进程的速度非常慢,这让我相信 CPU 正在“忙”着做某事。但我的理解是,处于 D 状态的进程没有做任何事情,只是在等待。这应该需要任何 CPU 计算,实际上释放 CPU 并让它安排其他任务。

我肯定漏掉了什么,因为 D 状态进程也会增加系统的平均负载。我不明白为什么要这样做,处于不间断睡眠状态的进程如何增加负载?

答案1

当您在控制台上输入命令时,这个“命令”——如果不是 shell 内置命令——也是一个系统文件,一个可执行文件。当您输入“ls”时,系统会按顺序搜索 PATH 变量中的所有目录,以查找名为“ls”的可执行文件——至少只要“ls”之前没有经过哈希处理。

此搜索意味着访问光盘的多个目录。如果如您所写,有许多进程在等待 I/O,那么您的 shell 也必须等待才能搜索您输入的命令。

另外,您键入的某些命令还需要读取和/或写入磁盘上的某些文件,从而增加了等待 I/O 过程的时间...

这不会增加 CPU 负载,但会增加 I/O 负载,在 Linux 中 I/O 负载也计入“总负载”,为什么?我认为这只是定义问题。请参阅http://en.wikipedia.org/wiki/Load_%28computing%29

因此,将 I/O 分布在多个磁盘(而不是分区)上可以提高性能。将系统放在一个磁盘上,将数据放在其他磁盘上会有所帮助。另外想想,启动一个新 shell 会让它搜索您的 $HOME 以查找 .profile、.bashrc 等文件,如果磁盘忙于处理许多其他 I/O,这可能需要一些时间。

答案2

D 是不可中断的睡眠。是的,理论上 D 状态下的进程处于睡眠状态,不直接使用 I/O。但从我对这种状态下的进程的经验来看,这很可能意味着设备驱动程序中出现了问题。如果您有许多“D”状态的进程,那么您的操作系统就会出现非常糟糕的情况。这可能是驱动程序中的自旋循环(浪费 CPU 周期)、读取和丢弃缓冲区等等。我会检查您的系统日志和 dmesg 以查找任何设备或设备驱动程序错误。

总之,D 不是一种自然状态,偶尔出现的过程可能会被忽略,但如果您有很多 D 过程并且遇到速度缓慢的情况,那么您需要进行一些探索。

相关内容