16.4.1 膝上型计算机模式
膝上型计算机模式是一种特殊的页回写策略,该策略主要意图是将硬盘转动的机械行为最小化,允许硬盘尽可能长时间地停滞,以此延长电池供电时间。该模式可通过/proc/sys/vm/laptop_mode文件进行配置。通常,上述配置文件内容为0,也就是说膝上型计算机模式关闭,如果需要启用膝上型计算机模式,则向配置文件中写入1。
膝上型计算机模式的页回写行为与传统方式相比只有一处变化。除了当缓存中的页面太旧时要执行回写脏页以外,flusher还会找准磁盘运转的时机,把所有其他的物理磁盘I/O、刷新脏缓冲等通通写回到磁盘,以便保证不会专门为了写磁盘而去主动激活磁盘运行。
上述回写行为变化要求dirty_expire_interval和dirty_writeback_interval两阈值必须设置得更大,比如10分钟。因为磁盘运转并不很频繁,所以用这样长的回写延迟就能保证膝上型计算机模式可以等到磁盘运转机会写入数据。因为关闭磁盘驱动器是节电的重要手段,膝上模式可以延长膝上计算机依靠电池的续航能力。其坏处则是系统崩溃或者其他错误会使得数据丢失。
多数Linux发布版会在计算机接上电池或拔掉电池时,自动开启或禁止膝上型计算机模式以及其他需要的回写可调节开关。因此机器可在使用电池电源时自动进入膝上型计算机模式,而在插上交流电源时恢复到常规的页回写模式。
16.4.2历史上的bdflush、kupdated和pdflush
在2.6版本前,flusher线程的工作是分别由bdflush和kupdated两个线程共同完成。
当可用内存过低时,bdflush内核线程在后台执行脏页回写操作。类似flusher,它也有一组阈值参数,当系统中空闲内存消耗到特定阈值以下时,bdflush线wakeup_bdflush()函数唤醒。
bdflush和当前的flusher线程之间存在两个主要区别。第一个区别是系统中只有一个bdfiush后台线程,而fiusher线程的数目却是根据磁盘数量变化的(这在16.5节中会谈到);第二个区别是bdflush线程基于缓冲,它将脏缓冲写回磁盘。相反,flusher线程基于页面,它将整个脏页写回磁盘。当然,页面可能包含缓冲,但是实际I/O操作对象是整页,而不是块。因为页在内存中是更普遍和普通的概念,所以管理页相比管理块要简单。
因为只有在内存过低和缓冲数虽过大时,bdflush例程才刷新缓冲,所以kupdated例程被引入,以便周期地写回脏页。它和pdflush线程的wb_writeback()函数提供同样的服务。
在2.6内核中,buflush和kupdated已让路给了pdflush线程——page dirty flush(比以前两个更容易令人混淆的名字)的缩写。Pdflush线程的执行和今天的flusher线程类似。其主要区别在于,pdflush线程数目是动态的,默认是2个到8个,具体多少取决于系统I/O的负载。Pdflush线程与任何任务都无关,它们是面向系统所有磁盘的全局任务。这样做的好处是实现简单,可带来的问题是,pdflush线程很容易在拥塞的磁盘上绊住,而现代硬件发生拥塞更是家常便饭。采用每个磁盘一个刷新线程可以使得I/O操作同步执行,简化了拥塞逻辑,也提升了性能。
……
展开