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

时间:2008-12-24 20:43:27

标签: linux performance storage disk

如果我开始将一个巨大的文件树从一个位置复制到另一个位置,或者如果某个其他进程开始执行大量磁盘活动,则前台应用程序(GUI)会慢下来。例如,取一个带有100k文件的2gb文件树。打开一个控制台,然后执行cp -r bigtree bigtree2。然后去firefox开始浏览。 Firefox几乎无法使用。即使我将firefox的优秀级别设置为真正的高优先级(-20),它仍然会非常缓慢而且会有很长的延迟。

我记得几年前当我在Solaris机箱上工作时,系统在类似情况下表现得更好。

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

4 个答案:

答案 0 :(得分:16)

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 :(得分:7)

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

目前有关于此的Ubuntu brainstorm

答案 2 :(得分:2)

你不是第一个注意到这个问题的人。前内核开发人员[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补丁集运行。

答案 3 :(得分:0)

确保在支持它的所有驱动器上启用了DMA。根据您的分布,这可能不是默认值。阅读 man hdparm ,并查看您的系统 init 机制。