对于这个特定的 make 进程,进入不可中断深度睡眠状态的原因可能是什么?

对于这个特定的 make 进程,进入不可中断深度睡眠状态的原因可能是什么?

我试图'D'正确理解状态。

就我而言,以下过程是'D'这样的:

make -f freac/CMakeFiles/freac_objs.dir/build.make freac/CMakeFiles/freac_objs.dir/build

它使用 NFS 共享。

负载也不断增加。 load_avg 现在为 1600(40 个 CPU)。我认为 40 个处理器是可以接受的限制。

好吧,抛开这个,我想知道三件事:

  1. 为什么进程处于'D'状态时负载会增加?
  2. 为什么进程会进入'D'访问 NFS 共享很麻烦的状态,而不是完全杀死进程?
  3. 什么可能会导致访问 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 请求最终失败。但我们可以看到,由于timeoretrans选项,这并不是立即发生的。

由于多种原因,客户端可能会看到 NFS 问题;常见的一个是网络带宽(特别是如果您使用的是 WiFi 网络)。另一个是请求量(如果并行运行,那么可能会造成瓶颈)。服务器本身可能因磁盘性能较差而对 NFS 请求响应缓慢,或者服务器可能没有运行足够的守护线程来处理大量请求。

相关内容