从 Linux 内核 VS 内存碎片 (上) 我们可以看到根据迁移类型进行分组只是延缓了内存碎片,而并不是从根本解决,所以随着时间的推移,当内存碎片过多,无法满足连续物理内存需求时,将会引起性能问题。因此仅仅依靠此功能还不够,所以内核又引入了内存规整等功能。
内存规整
在内存规整引入之前,内核还使用过 lumpy reclaim 来进行反碎片化,但在我们当前最常用的 3.10 版本内核上已经不存在了,所以不做介绍,感兴趣的朋友请从文章开头整理的列表中自取,我们来看内存规整。
内存规整的算法思想在 Memory compaction 有详细描述,简单来说是从选中的 zone 底部扫描已分配的迁移类型为 MIGRATE_MOVABLE 的页面,再从此 zone 的顶部扫描空闲页面,把底部的可移动页移到顶部的空闲页,在底部形成连续的空闲页。
选中的碎片化 zone:

扫描可移动的页面:

扫描空闲的页面:

规整完成:

本文探讨了Linux内核如何应对内存碎片问题,重点介绍了内存规整算法及其工作原理,包括从zone底部扫描可移动页面到顶部的空闲页,以及内存规整的触发时机。同时,提到了直接内存回收在内存管理中的角色,以及监控内存状态的工具。内存规整虽然开销大,但社区仍在不断优化。文章还提供了观察内存碎片指数的接口,并给出了减少直接内存回收和缓解碎片问题的建议,如调整vm.min_free_kbytes参数。
最低0.47元/天 解锁文章
869

被折叠的 条评论
为什么被折叠?



