我的桌面通常反应非常灵敏,即使在重负载下也是如此。但当我将文件复制到 USB 驱动器时,它总是在一段时间后锁定。我所说的“锁定”是指:
- 将焦点从一个窗口移动到另一个窗口可能需要 10 到 20 秒
- 切换桌面可能需要 10-20 秒
- 视频不再更新(在 YouTube 中,音频继续播放,只有视频冻结)
发生这种情况时,系统负载并不是特别高。有时,我在 xosview 上看到很多白色,表明内核某处正忙。
乍一看,似乎将文件复制到 USB 驱动器会以某种方式干扰 compiz,但我无法想象连接可能是什么。
这是输出htop
:
iostat -c -z -t -x -d 1
以下是2 分钟挂起期间的输出:
19.07.2012 20:38:22
avg-cpu: %user %nice %system %iowait %steal %idle
1,27 0,00 0,38 37,52 0,00 60,84
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdg 0,00 2,00 0,00 216,00 0,00 109248,00 1011,56 247,75 677,69 0,00 677,69 4,63 100,00
如您所见,只有外部硬盘处于活动状态。这是完整的日志:http://pastebin.com/YNWTAkh4
挂起时间为20:38:01,结束时间为20:40:19。
软件信息:
- 开放SUSE 12.1
- KDE 4.7.x
- 文件系统:内部硬盘上的 reiserfs 和 btrfs,USB 驱动器上的 btrfs
答案1
我的第一个猜测是btrfs
因为该文件系统的 I/O 进程有时会接管。但这并不能解释为什么 X 会锁定。
看看中断,我看到了这一点:
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
0: 179 0 0 0 0 0 0 0 IR-IO-APIC-edge timer
1: 6 0 0 0 0 0 0 0 IR-IO-APIC-edge i8042
8: 1 0 0 0 0 0 0 0 IR-IO-APIC-edge rtc0
9: 0 0 0 0 0 0 0 0 IR-IO-APIC-fasteoi acpi
12: 10 0 0 0 0 0 0 0 IR-IO-APIC-edge i8042
16: 3306384 0 0 0 0 0 0 0 IR-IO-APIC-fasteoi ehci_hcd:usb1, nvidia, mei, eth1
嗯,呃。 USB 驱动程序使用与显卡相同的 IRQ,并且它位于链中的第一个。如果它锁定(因为文件系统执行了一些昂贵的操作),显卡就会陷入饥饿(网络也同样如此)。
答案2
我见过类似的问题开放SUSE12.1 的 linux-3.1 内核,发现禁用透明大页面有帮助:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
根本问题是,如果应用程序分配 4MB 或更多,内核将尝试为其提供一个大页面,为此它需要整个连续的 4MB RAM。现在,如果周围有许多脏页,仍然需要写入慢速 USB 设备,它会等待 IO 完成,然后再继续内存分配。
答案3
如前所述,这可能与内核大页面设置有关。我认识几个有这个问题的人。您可以在网上找到一些有关它的文档,例如
- https://bbs.archlinux.org/viewtopic.php?id=112846&p=1
- http://lwn.net/Articles/467328/
- http://forum.manjaro.org/index.php?topic=2062.0
- 将文件复制到 USB 设备或从 USB 设备复制文件时性能缓慢
我通过执行以下操作完全解决了我的设置问题。请注意,YMMV,并非下面的所有修复都是必要的,而且可能还不够。老实说,我可能忘记了一些事情。无论如何,这是我的设置并且有效。
- 使用linux-ck内核
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
答案4
更换电缆。去除 USB 端口/电缆上的氧化物。