概述
内存回收主要是有kswapd异步回收和direct reclaim同步回收两种入口,其中逻辑非常复杂,本文主要只概要描述不同回收场景下内核设计的主要思想,源码细节不同版本有不少区别,具体的分析后续会有专门的文章分析。

页面回收常识:
- 页面扫描回收时才意味着老化。
- 一个页面被访问之后,相应的access标记会一直打在那里,直到这个页面被扫描。LRU里面的时间流逝跟自然时间是没有关系的,扫描才是推动历史车轮前进的动力。而扫描又是由于达不到balanced而被触发的,可见页面老化的速度跟系统中内存的紧缺程度是相关的。内存紧缺的时候,1分钟前才被访问过的页面可能都不会被视作活跃;反过来,如果内存不紧缺,长期不需要进行回收,那么几小时前访问过的页面又可能都会被视作活跃,并且在这段时间内被访问过一次和被访问过多次的页面会被同等对待(access是标记而不是计数);
kswapd后台异步回收
1)何时唤起kswapd:

- 如果内存低于low watermark系统会唤醒kswapd进行内存回收
- alloc_page申请内存时候,先使用low watermark进行快速内存申请,如果失败了就会进入慢路径(也就是说free page < low),这个时候会主动wakeup kswapd,同时使用min watermark申请内存。
2)kswapd何时停止,回收(一个for循环)的频率如何
核心思路:既要高效回收page,又不能过度消耗CPU。
- 如上图kswapd如果判定pgdat_balanced(判定order和high watermark是否满足),那么就先进入“浅睡眠”(schdule_timeout(100)),避免马上陷入full sleep(TASK_INTERRUPTIBLE sleep),只能等到direct reclaim唤醒了,影响了内存分配性能,这里也可以看出kswapd的作用就是要尽量保持内存在high watermark,但是又要避免for(;;)过度循环导致cpu太高。
- 如果kswapd回收后满足pgdat_balanced陷入睡眠后

文章探讨了Linux内核中的内存回收机制,主要涉及kswapd的异步回收和directreclaim的同步回收。kswapd在内存低于lowwatermark时启动,目标是使内存达到highwatermark,回收过程中考虑CPU效率和内存平衡。directreclaim是快速路径回收,主要用于无I/O开销的内存分配,允许swap但不允许脏页回写。文章强调了回收策略与内存紧缺程度、页面老化的关系,并概述了不同回收场景下的核心思想。
最低0.47元/天 解锁文章
1800

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



