如何防止 [flush-8:16] 和 [jbd2/sdb2-8] 导致 GUI 无响应?

ænd*_*rük 11 cpu-load disk-usage

大约每周两次,整个图形界面会在没有警告的情况下锁定大约 10-20 秒,而我正在执行诸如浏览网页或写论文之类的简单任务。发生这种情况时,GUI 元素不会响应鼠标或键盘输入,并且系统监视器小程序显示 100% IOWait 处理器使用率。

今天,我终于碰巧在问题开始时已经打开了 GNOME 终端。尽管 Google Chrome、Firefox、GNOME Do 和 GNOME Panel 等其他应用程序没有响应,但终端仍然可用。我运行iotop并观察到命名[flush-8:16][jbd2/sdb2-8]交替使用 99.99% IO 的命令。

这些是什么,我如何防止它们导致 GUI 无响应?

细节

$ mount | grep ^/dev
/dev/sda1 on / type ext4 (rw,noatime,discard,errors=remount-ro,commit=0)
/dev/sdb2 on /home type ext4 (rw,commit=0)
$ cat /proc/swaps 
Filename        Type        Size     Used    Priority
/dev/sdb3       partition   1052252  0       -1
Run Code Online (Sandbox Code Playgroud)

/dev/sdaOCZ-VERTEX2/dev/sdb是一个WD10EARS。这是dumpe2fs /dev/sdb2smartctl /dev/sdb --all

我在dmesg或 中没有看到任何异常/var/log/syslog

j-g*_*tus 4

我大胆提出一个理论:

/dev/sdb1也许是交换空间?

如果图形界面的核心内容已卸载到磁盘,则 GUI 无法继续运行,直到收到这些数据。如果交换磁盘正在睡眠,这意味着它会卡住,直到磁盘响应。

我认为这会产生临时锁定,并且 10-20 秒的时间段适合休眠磁盘响应所需的时间。终端可能仍然有响应,因为它所需的一切已经在 RAM 中。

一些探索理论的终端工具:

  • hdparm -C /dev/sdX告诉您磁盘是否正在睡眠:

    $ sudo hdparm -C /dev/sdb
    /dev/sdb:
    drive state is:  standby
    
    Run Code Online (Sandbox Code Playgroud)

    active/idle意味着它正在运行。处于停止旋转状态,需要一段时间才能再次启动standbysleepingman hdparm

  • free -m表示使用了多少交换空间:

    $ free -m     
                 total       used       free     [...]
    Mem:          5973       4928       1045     [...]
    -/+ buffers/cache:       1091       4882
    Swap:         6234          0       6234
    
    Run Code Online (Sandbox Code Playgroud)

    “Swap:”是相关行,在此示例中,有 6.2 GB 交换可用,但未使用任何内容。

如果这是问题所在,您可以将交换区移至 sda 或禁用 sdb 的降速。