如何阻止 Ubuntu 因进程进入“磁盘睡眠”而挂起?

如何阻止 Ubuntu 因进程进入“磁盘睡眠”而挂起?

我在 AMD 上使用 Ubuntu 9.04 64 位。当某些进程的 CPU 使用率百分比进入“磁盘睡眠”状态时,它经常会挂起几分钟。在此期间,我无法启动新程序,桌面上的大多数程序都无响应。

我希望它不会挂起,并且我的应用程序保持可靠的响应。为什么会发生这种情况?我该如何阻止它?

答案1

处于磁盘休眠或不间断休眠状态的进程通常正在等待某些 I/O 操作完成。在此状态下,它无法通过信号唤醒,因此无法使用 SIGKILL 信号终止进程。

我对发生的事情的理解有限:内核中的 CPU 调度程序维护一个运行队列,它是准备运行的进程列表。当一个进程获得 CPU 时,它要么

  1. 充分利用时间片并按计划完成任务,或者
  2. 它需要等待操作的响应,通常是I/O,并请求转移到睡眠队列,等待事件。

由于 #2 而被调度出去的进程还会向调度程序指示它们在等待事件时是否应该被中断。当它们被信号(通常是设备驱动程序)中断而无法继续正常运行时,它们会指示它们只能由事件唤醒。这些进程处于不可中断的睡眠状态,并将被移至睡眠队列。

如果你经常遇到由于磁盘睡眠导致系统冻结的情况,那么这可能是

  • 有缺陷的设备驱动程序
  • 硬件有故障(磁盘驱动器?)
  • 已挂载的文件系统响应缓慢。

我在 NFS 文件系统中多次见过这种情况。如果由于某种原因设备响应丢失,则进程将保持休眠状态,这使得在重新启动之前几乎不可能使用挂载/设备。

如果您认为是硬盘访问导致了 I/O 冻结,则最好检查驱动器上是否存在坏块或坏扇区。

相关内容