15

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

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

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

4

4 回答 4

18

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 放入磁盘队列的等待时间更短。

于 2008-12-25T00:38:55.903 回答
7

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

目前有一个关于这个的 Ubuntu头脑风暴

于 2008-12-24T20:50:28.640 回答
3

你不是第一个注意到这个问题的人。前内核开发人员 [Con Kolivas] ( http://en.wikipedia.org/wiki/Con_Kolivas ) 发现很多公司都在以牺牲桌面性能为代价来提高 linux 服务器性能。Con 有一组令人印象深刻的补丁,可以让桌面响应更快。不幸的是,发生了某种代码大战,最终Con 退出了

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

于 2008-12-25T01:33:13.280 回答
0

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

于 2008-12-25T21:24:11.817 回答