当大量磁盘活动发生时如何使 Linux GUI “可用”

Posted

技术标签:

【中文标题】当大量磁盘活动发生时如何使 Linux GUI “可用”【英文标题】:How to make Linux GUI "usable" when lots of disk activity is happening 【发布时间】:2010-09-28 09:03:38 【问题描述】:

如果我开始将一个巨大的文件树从一个位置复制到另一个位置,或者如果某个其他进程开始执行大量磁盘活动,则前台应用程序 (GUI) 的运行速度会变慢。例如,采用一个 2gb 的文件树,其中包含 100k 个文件。打开控制台并执行 cp -r bigtree bigtree2。然后转到Firefox并开始浏览。 Firefox 几乎无法使用。即使我将 firefox 的 nice 级别设置为非常高的优先级 (-20),它仍然超级慢且延迟很大。

我记得几年前我在一个 Solaris 机器上工作时,系统在类似情况下的表现要好得多。

我的 HD 使用的是 DMA,而不是 PIO。是SATA。未安装 atime 标志。

【问题讨论】:

【参考方案1】:

Linux 长期以来一直存在占用系统所有“脏”缓存内存的程序问题。正在发生的事情是复制过程正在用它正在复制的文件数据填充写入缓存,并且它正在非常快速地完成它。因此,当 Firefox 出现并需要写入时,它必须首先等待脏缓冲区空间或可用的磁盘队列写入槽。在等待期间,它与复制进程和内核的 pdflush 线程竞争,后者将数据从脏缓冲区移动到磁盘写入队列。

Firefox 在这种情况下还有另一个问题。它使用 SQLite 来存储它的书签、历史和其他东西。 SQLite 是一个符合 ACID 的数据库,它使用事务系统,其磁盘写入刷新到磁盘。所以它不仅要等待缓冲区空间,还要等待已满复制文件的磁盘队列清空后才能确认写入成功。

对 Linux 磁盘排队和缓冲系统进行了很多的调整。几乎每个内核版本都有变化。尝试其中一个较新的版本。您也可以尝试调整 sysctl 值。我有点喜欢这些:

vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 9000
vm.dirty_background_ratio = 4
vm.dirty_ratio = 80

您也可以尝试调整磁盘队列中的插槽数。此值位于 /sys/block/sda/queue/nr_requests 中。您需要将 sda 替换为您的实际驱动器。更多槽意味着更多合并 IO 请求的机会,并且 CFQ IO 调度程序可以更好地处理优先级。更少的插槽通常意味着更短的等待写入磁盘的同步 IO (如 SQLite 的事务)。如果写入量大的进程完全用写入 IO 填充队列,则更少的插槽也意味着将读取 IO 放入磁盘队列的等待时间更短。

【讨论】:

+1 以获得非常好的和详细的答案。也许他也可以使用其他浏览器。 Firefox 蹩脚而臃肿。 Related LWN article 和 Unix.SE answer。【参考方案2】:

尝试ionice-ing 或 nice-ing 复制过程。问题是由于 IO 获得与 GUI 相同的优先级,这对于桌面来说会影响感知响应能力。

目前有一个关于这个的 Ubuntu brainstorm。

【讨论】:

我会试试的。但这并不是我想要的。我希望所有后台磁盘活动都能自动离子化或其他。我希望系统足够聪明,可以说“嘿,有人在尝试做某事。别惹他生气了。” 我不确定当前是否有任何方法可以在全局级别上配置优先级。但是,您可以配置用于每个块设备的 IO 调度程序(回显期限 > /sys/block//queue/scheduler)。阅读donami.com/118了解更多详情。 系统无法自动知道。您输入了 cp 命令,因为系统知道您正在焦急地等待它完成。 系统知道哪个窗口在前台,以及哪个窗口中正在发生什么击键/鼠标活动。因此它知道我在焦急地等待着什么【参考方案3】:

您不是第一个注意到这个问题的人。前内核开发人员 [Con Kolivas] (http://en.wikipedia.org/wiki/Con_Kolivas) 发现很多公司都在花钱以牺牲桌面性能为代价来提高 linux 服务器性能。 Con 有一个令人印象深刻的set of patches for making the desktop more responsive。不幸的是,发生了某种代码大战,最终Con dropped out。

我很想知道如何向 Linux 内核开发人员请愿以获得更好的桌面性能。同时,如果您愿意运行内核 2.6.22,您可以使用-ck 补丁集运行

【讨论】:

【参考方案4】:

确保在所有支持它的驱动器上启用 DMA。根据您的发行版,这可能不是默认设置。阅读 man hdparm,了解您的系统 init 机制。

【讨论】:

以上是关于当大量磁盘活动发生时如何使 Linux GUI “可用”的主要内容,如果未能解决你的问题,请参考以下文章

实时更新 GUI

Qt信号和槽

GUI编程以在Linux中显示磁盘中的记录

当我的 UIPanGestureRecognizer 与 UIScrollView 一起发生时,如何取消其他事件?

Pyads 读取通知值:当 TwinCat 循环发生时

当关闭视图启动位置服务通知错误发生时