这篇说说Linux的页缓存数据同步和页回收机制。数据同步和页回收是两个独立的概念,数据同步处理的是内存/缓存的数据和后备设备的数据一致问题,页回收处理的是在内存空间不足时如何回收已分配的物理内存页,来获得足够空间分配干净页,支持优先级更高的工作。数据同步在任意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发。
数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件中去。有两种方式可以调用数据同步
1. 周期性的调用,主要是pdflush机制
2. 强制调用,比如调用sync, fsync系统调用。当脏页数量很多时,内核也会强制进行数据同步,来控制脏页的数量,使数据同步造成的IO尽量平滑
pdflush是一组内核线程,相当于内核维护了一个pdflush线程池,根据数据同步的负载来分配pdflush线程,一个pdflush线程可以对应一个块设备,这样多个pdflush线程对应多个块设备,可以避免单个块设备的IO负载过大影响其他块设备的数据同步。
cat /proc/sys/vm/nr_pdflush_threads 可以查看当前系统启动的pdflush线程数量
下图给出了sync等系统调用触发的数据完整性同步(即同步所有的脏页),以及pdflush触发的周期性刷出同步所调用的内核函数
1. 可以看到数据同步的目标主要是文件系统的对象,比如文件系统超级块,文件inode元数据,文件inode数据块。
2. 不管是数据完整性同步,还是flush同步,最后的调用路径都汇集到了sync_sb_inodes函数,这个函数会同步给定超级