我试图'D'
正确理解状态。
就我而言,以下过程是'D'
这样的:
make -f freac/CMakeFiles/freac_objs.dir/build.make freac/CMakeFiles/freac_objs.dir/build
它使用 NFS 共享。
负载也不断增加。 load_avg 现在为 1600(40 个 CPU)。我认为 40 个处理器是可以接受的限制。
好吧,抛开这个,我想知道三件事:
- 为什么进程处于
'D'
状态时负载会增加? - 为什么进程会进入
'D'
访问 NFS 共享很麻烦的状态,而不是完全杀死进程? - 什么可能会导致访问 NFS 共享时突然出现问题(大多数情况下是由于网络原因吗?)
谢谢!
答案1
处于“D”状态的进程通常(但并非总是)“在 I/O 等待时阻塞”。例如,如果磁盘繁忙且服务时间较长,则可能会发生这种情况。状态中的进程D
计入平均负载,即使它们没有使用真正的 CPU 资源。
对于 NFS,进程可能会花费大量时间处于“D”状态等待 NFS 服务器响应。
NFS 客户端的默认行为是在重试之前重试最多 60 秒(请参阅timeo
中的选项man nfs
)。这意味着如果出现问题,进程可能会处于 I/O 等待至少 60 秒。
接下来会发生什么取决于retrans
设置和hard/soft
设置。
如果文件系统已挂载hard
,则无限期地重试;如果已安装soft
,则 I/O 请求最终失败。但我们可以看到,由于timeo
和retrans
选项,这并不是立即发生的。
由于多种原因,客户端可能会看到 NFS 问题;常见的一个是网络带宽(特别是如果您使用的是 WiFi 网络)。另一个是请求量(如果并行运行,那么可能会造成瓶颈)。服务器本身可能因磁盘性能较差而对 NFS 请求响应缓慢,或者服务器可能没有运行足够的守护线程来处理大量请求。