linux内存管理-页面规整
页面规整
背景
linux长时间运行后,可能会发生页面申请失败,原因有两种情况:
对于第一种情况主要通过页面回收的方式来回收到足够的内存页,包括释放干净的文件映射页,回写脏页,匿名页到swap方式回收到可用的物理内存,但是第二种情况就比较复杂。
系统长时间运行后,不断的申请和释放页,最终可能是有可用的内存,但是缺少连续的物理内存,就是内存碎片,就和上图一样。虽然buddy以简单的方式能够很好的维护连续空闲页,但是它并对内存碎片问题并没有解决方式。而且内存碎片问题也无法彻底解决,目前有两种方式能够缓解这个问题:
页面规整的原理
reflink:https://lwn.net/Articles/368869/
页面碎片如上图所示,白色代表空闲页,红色代表使用的页。现在虽然有8个page的空闲内存,但是无法申请连续的4个页面,而且申请连续的2个页面都不行,buddy管理的页面中他们都不符合合并的规则,只有8个order=0的页。
页面规整的整体算法:以zone为规整对象,其中每次扫描又以pageblock为单位进行扫描。它有两个指针:从zone头部开始的migrate和从zone尾部开始的free,首先从头部收集一批可移动的页,然后从尾部收集一批空闲页,将可移动页迁移到尾部的空闲页中,最后当migrage和free在中间相遇时,前半部分已经没有可移动的页,后半部分没有了空闲页,退出整个规整过程。
从头部扫描可移动页:
从尾部扫描空闲页:
页面规整之后的结果:
上面展示了非常理想的工作过程。但是并不是所有的页都可移动的,只有那些可以通过页表访问的页并且没有被lock的页才可以移动,这些页基本上都是应用进程使用的页,而内核的页大部分都是不可移动的,但是其中的一部分是可回收的,在需要的时候直接释放掉。往往一个不可移动的页就能破坏一大片连续内存的连续性,不过内核中的迁移类型机制最大限度的隔离了不可移动的页和可移动页的,内存规整的效果是依赖于迁移类型机制的。
页面规整主要有两种触发方式:
页面规整的实现
页面规整有两种模式:异步和同步,在页面回收失败的时候首先开启异步的页面规整,如果异步页面规整不出满足要求的内存,接下来使用尝试通过直接内存回收方式回收到足够的内存,如果还是获取不到足够的连续内存,那么再次尝试通过同步页面规整的方式获取连续内存。
页面规整的对象类型有两种迁移类型:MIGRATE_RECLAIMABLE,MIGRATE_MOVABLE,从规整方式来看有两种:匿名映射和文件映射类型的页。
异步页面规整只规整匿名页,而同步页面规整还会处理文件脏页,如果页面正在回写,它还会等待页面完成回写。
异步页面规整相对来说比较保守,匿名页的页面迁移只需要将页的内容迁移到新页中,创建新的映射关系,解除旧的映射关系,全是内存的读写操作,而同步还涉及到IO回写,它的耗时更长。
外部碎片严重程度的计算
系统通过/sys/kernel/debug/extfrag/unusable_index导出了外部碎片的概率,从0-1,这个值越高代表有连续可用内存的概率越小,外部碎片问题越严重,当申请2^order页时越困难。
统计0-order中空闲页的总数量和各个阶链表上空闲块的总数,当空闲页数量一定时,如果低阶的空闲页数量越多,则block值越高,则最后的碎片化也越严重;如果高阶的空闲页数量多,则block相对较小,碎片化整理起来难度相对更加容易
页面规整实现过程
开始从zone的头部开始扫描pageblock,如果是异步规整模式,则只隔离MIGRATE_MOVABLE中的匿名页,将它从LRU中隔离到migratepages中,一次最大COMPACT_CLUSTER_MAX个页,扫描完成后记录当前扫描的位置migrate_pfn,这样小块的页面迁移方便在回收失败的时候将隔离页重新返回到LRU链表中。
对于文件映射的脏页,如果不是同步模式页面规整,则不进行回写,如果该页面正在回写,也不等待回写完成。如果是同步模式则对于脏页需要回写,并且等待正在回写页的完成。
迁移总共分三部分,中间比较复杂,涉及到反向映射的实现:
页面规整的结束条件
对于重复进行页面规整的避免
zone中记录了页面规整的状态,compact_defer_shift定义了页面规整的阈值,compact_considered标记当前已经推迟了多少次的页面规整请求。
当页面规整后仍然无法满足页面申请的需求,对zone进行标记compact_defer_shift;如果接下来继续发起了页面规整,则不会再频繁的发起页面规整,它认为短时间内页面规整不会有太大的效果,这时候会记录推迟了多少次的规整请求compact_considered,当发起的请求超过阈值之后才会再次发起规整请求。
当页面规整满足了页面申请后会重置阈值和推迟请求次数。
总结
以上是生活随笔为你收集整理的linux内存管理-页面规整的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 全新8.6版本SEO快排系统(可源码级搭
- 下一篇: linux内存管理笔记(四十二)----