计算机底层知识拾遗(七)页缓存数据同步和页回收机制

这篇说说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函数,这个函数会同步给定超级块的所有脏inodes

同步一个超级块的所有脏inodes 如果每次都要遍历所有的inode链表去过滤脏inode,那效率是相当低下的。实际上内核专门维护了一个脏inode链表,通过超级块的super_block --> s_dirty指针指向这个脏inode链表,这样只要依次对这个链表的inode进行同步即可。

对一个inode同步包括两部分,元数据同步和数据块同步,内核提供了很多标志位来细化数据同步的操作细节。

比较几个强制同步的系统调用

sync:同步所有的脏页,是数据完整性同步。当IO请求发送到请求队列后就返回,不等待磁盘操作的完成。当磁盘发生故障时可能造成数据丢失

fsync: 对单个文件的元数据和数据块同步,等待直到磁盘操作完成后才返回,保证了数据的可靠性

fdatasync: 对单个文件的数据块同步,等待直到磁盘操作完成后才返回,保证了数据的可靠性

msync:对mmap产生的脏页进行同步

页回收机制包含了三部分,数据刷出flush, 交换swap, 释放release.

数据刷出flush和数据同步是类似的,就是把有后备文件的页缓存都同步到磁盘,从而可以回收这些页面

交换swap主要是对匿名映射,私有映射,malloc动态分配的内存这些没有后备文件的内存页进行回收,把他们交换到位于磁盘的交换区,从而可以回收这些页面

释放release主要是一些针对一些LRU的只读内存页,在压力大的情况下直接释放,从而可以回收这样页面

内核的页面回收机制主要要解决几个问题:

1. 采用何种回收算法来保证最大的收益

2. 回收哪些页

3. 如何组织交换区,如何存取交换区中页

4. 在回收压力大的情况下如何避免页颠簸

时间: 2024-08-27 20:35:03

计算机底层知识拾遗(七)页缓存数据同步和页回收机制的相关文章

计算机底层知识拾遗(六)理解页缓存page cache和地址空间address_space

在这篇计算机底层知识拾遗(五)理解块IO层 中讲了块缓存buffer cache块缓存,这篇说说页缓存page cache以及相关的地址空间address_space的要点. 在Linux 2.4内核中块缓存buffer cache和页缓存page cache是并存的,表现的现象是同一份文件的数据,可能即出现在buffer cache中,又出现在页缓存中,这样就造成了物理内存的浪费.Linux 2.6内核对两个cache进行了合并,统一使用页缓存在做缓存,只有极少数的情况下才使用到buffer

计算机底层知识拾遗(三)理解磁盘的机制

磁盘是一种重要的存储器,位于主存结构的下方,是永久存储的介质.在计算机底层知识拾遗(一)理解虚拟内存机制 这篇中说了虚拟内存是面向磁盘的,理解磁盘的工作原理对理解计算机的很多概念有很大的帮助.尤其是在数据库和分布式存储领域,要经常和磁盘打交道. 磁盘这块主要有几个部分的概念: 1. 磁盘的基本结构和工作原理 2. 如何在虚拟内存机制下与内存高效地交换数据 3. 磁盘如何保证数据存储的可靠性及故障恢复 磁盘的基本结构和工作原理 从单个磁盘来说,由一个个的同心圆组成,一个同心圆就是一个磁道,每个磁道

计算机底层知识拾遗(二)深入理解进程和线程

关于进程和线程,大家总是说的一句话是"进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元".这句话理论上没问题,我们来看看什么是所谓的"资源"呢. 什么是计算机资源 经典的冯诺依曼结构把计算机系统抽象成 CPU + 存储器 + IO,那么计算机资源无非就两种: 1. 计算资源 2. 存储资源 CPU是计算单元,单纯从CPU的角度来说它是一个黑盒,它只对输入的指令和数据进行计算,然后输出结果,它不负责管理计算哪些"指令和数据". 换句话

计算机底层知识拾遗(四)理解文件系统

操作系统的很多核心组件都是相互关联的,比如虚拟内存管理,物理内存管理,文件系统,缓存系统,IO,设备管理等等,都要放在一起来看才能从整体上理解各个模块到底是如何交互和工作的.这个系列的目的也就是从整体上来理解计算机底层硬件和操作系统的一些重要的组件是如何工作的,从而来指导应用层的开发.这篇讲讲文件系统的重要概念,为后面的IO系统做铺垫. 文件系统主要有三类 1. 位于磁盘的文件系统,在物理磁盘上存储文件,比如NTFS, FAT, ext3, ext4 2. 虚拟文件系统,在内核中生成,没有物理的

计算机底层知识拾遗(一)理解虚拟内存机制

这个系列会总结计算机,网络相关的一些重要的底层原理.很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了.随着工作的时间越久,越体会到这些基础知识的重要性.做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长.我自己深有体会,这些基础知识,底层原理是助你打破瓶颈的灵丹妙药.当理解了一些底层原理之后,会发现现在很多热门技术,原理,常见的设计都是在底层基础上发展而来的. 这篇总结一下单机系统的

计算机底层知识拾遗(十)理解进程调度【转】

转自:http://www.cnblogs.com/zfyouxi/p/4504042.html 这篇说说内核的进程调度机制,进程调度是内核的一个重要工作,由调度器完毕. 进程状态 内核调度器调度的实体(KSE, kernal schedule entry)是进程和线程.内核必须知道全部进程和线程的状态,比方把时间片给一个堵塞的进程是没有意义的.从内核的角度来看,进程的状态有3种: 1. 执行,表示正在执行的进程 2. 等待,没有执行,可是等待时间片执行的进程 3. 睡眠,也就是堵塞,包含可中断

计算机基本知识拾遗(七)页面缓存数据的同步和恢复机制页

本讲座Linux页面缓存数据的同步和恢复机制页.数据同步和恢复是两个独立的页面概念.数据同步处理是存储器/数据一致性问题缓存数据和备份设备.页面回收是如何回收分配的内存空间不足的物理内存页.为了获得足够的空间来分配一个干净的页面,支持更高优先级的工作.步在随意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发. 数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件里去.有两种方式能够调用数据同步 1. 周期性的调用,主要是pdflush机制 2. 强制调用,比方调用sync,

计算机底层知识

1 这篇万字长文,一下子把计算机底层知识说明白了 https://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTUwOQ==&mid=2247486427&idx=3&sn=f03bc1a695a9e2f837673f3012d65c6c&chksm=ce5e2951f929a047413a06b85c26d898ca9126f1369147e35a763542d435134584987a4e45b6&mpshare=1&scene=

040 RabbitMq及数据同步02

1.Spring AMQP (1)简介 Spring有很多不同的项目,其中就有对AMQP的支持: Spring AMQP的页面:http://spring.io/projects/spring-amqp 注意:Spring-amqp是对AMQP协议的抽象实现,而spring-rabbit 是对协议的具体实现,也是目前的唯一实现.底层使用的就是RabbitMQ. (2)依赖和配置 添加AMQP的启动器: <dependency> <groupId>org.springframewor