如果我开始将一个巨大的文件树从一个位置复制到另一个位置,或者如果某个其他进程开始执行大量磁盘活动,则前台应用程序(GUI)会慢下来.例如,取一个带有100k文件的2gb文件树.打开一个控制台,然后执行cp -r bigtree bigtree2.然后去firefox开始浏览.Firefox几乎无法使用.即使我将firefox的优秀级别设置为真正的高优先级(-20),它仍然超级缓慢而且有很长的延迟.
我记得几年前,当我在Solaris机箱上工作时,系统在类似情况下的表现要好得多.
我的HD使用DMA,而不是PIO.这是SATA.未安装atime标志.
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读入磁盘队列.
尝试复制或改善复制过程.问题是由于IO获得与GUI相同的优先级,对于桌面而言,这会影响感知的响应能力.
目前有关于此的Ubuntu 头脑风暴.