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