Linux内核内存管理:内存回收水位线机制深度解析

发布时间:2026/8/30 11:53:15

Linux内核内存管理:内存回收水位线机制深度解析
Linux内核内存管理内存回收水位线机制深度解析一、内存水位线体系的设计逻辑物理内存从来都是一项稀缺资源。内核必须在分配与回收之间建立精密平衡。Linux内核使用_水位线(watermark)_机制实现这一目标。每条内存zone维护三条水位线min、low、high。它们是内存回收子系统的核心阈值。当空闲页数量低于某条水位线时触发相应动作。stateDiagram-v2 [*] -- Normal : 空闲页 high Normal -- kswapd_Active : 空闲页 low kswapd_Active -- Normal : 空闲页 ≥ high Normal -- Direct_Reclaim : 空闲页 min kswapd_Active -- Direct_Reclaim : 分配速度 回收速度 Direct_Reclaim -- kswapd_Active : 回收成功低于high Direct_Reclaim -- OOM_Killer : 回收失败 OOM_Killer -- [*] note right of Normal 正常分配路径 __alloc_pages_nodemask end note note right of kswapd_Active 后台异步回收 balance_pgdat() end note note right of Direct_Reclaim 同步直接回收 __perform_reclaim end note水位线的核心设计思想是实现回收与分配的速率匹配。不追求永不触发回收而是让回收足够快。这正是内核设计中的务实哲学。二、min/low/high三条水位线的数学关系2.1 初始化计算水位线在启动时通过setup_per_zone_wmarks()计算。核心公式建立在min_free_kbytes之上。/* * 内核中水位线计算的核心逻辑 * 来源: mm/page_alloc.c (简化版本) */ static void __setup_per_zone_wmarks(void) { unsigned long pages_min min_free_kbytes (PAGE_SHIFT - 10); struct zone *zone; int i; for_each_zone(zone) { u64 tmp; /* min水位线由min_free_kbytes决定按zone大小比例分配 */ tmp (pages_min * zone-managed_pages) / total_managed_pages; zone-watermark[WMARK_MIN] tmp; /* * low水位线 min * 1.25提供回收缓冲区间 * high水位线 min * 1.5kswapd回收目标 * 比例因子确保系统有足够的异步回收余量 */ zone-watermark[WMARK_LOW] tmp * 5 / 4; zone-watermark[WMARK_HIGH] tmp * 3 / 2; /* watermark_boost用于内存碎片整理时的临时提升 */ zone-watermark_boost 0; } }2.2 水位线比例关系默认配置下三条水位线构成固定比例。min : low : high 1 : 1.25 : 1.5。min_free_kbytes通过/proc/sys/vm/min_free_kbytes可调。2.3 生产级观测模块以下是可直接运行的观测模块。/* * watermark_monitor.c - 水位线实时观测内核模块 * * 使用方式: * insmod watermark_monitor.ko * 观察 dmesg | tail -50 输出 * rmmod watermark_monitor * * 许可: GPL v2 */ #include linux/module.h #include linux/kernel.h #include linux/mm.h #include linux/mmzone.h #include linux/vmstat.h #include linux/proc_fs.h #define WMM_PROC_NAME watermark_monitor static int __init wm_monitor_init(void) { struct zone *zone; pg_data_t *pgdat; int node_id, zid; pr_info( 水位线观测模块加载 \n); pr_info(%-8s %-10s %8s %8s %8s %10s\n, Node, Zone, min_kb, low_kb, high_kb, free_kb); for_each_online_node(node_id) { pgdat NODE_DATA(node_id); for (zid 0; zid MAX_NR_ZONES; zid) { zone pgdat-node_zones[zid]; if (!populated_zone(zone)) continue; unsigned long min zone-watermark[WMARK_MIN] (PAGE_SHIFT - 10); unsigned long low zone-watermark[WMARK_LOW] (PAGE_SHIFT - 10); unsigned long high zone-watermark[WMARK_HIGH] (PAGE_SHIFT - 10); unsigned long free zone_page_state(zone, NR_FREE_PAGES) (PAGE_SHIFT - 10); pr_info(%-8d %-10s %8lu %8lu %8lu %10lu\n, node_id, zone-name, min, low, high, free); } } pr_info( 水位线比对完成 \n); return 0; } static void __exit wm_monitor_exit(void) { pr_info(水位线观测模块卸载\n); } module_init(wm_monitor_init); module_exit(wm_monitor_exit); MODULE_LICENSE(GPL v2); MODULE_AUTHOR(zhongyiren); MODULE_DESCRIPTION(Watermark monitor for Linux memory zones);三、kswapd守护进程的唤醒与回收策略3.1 kswapd唤醒条件每个NUMA节点拥有独立的kswapd线程。唤醒条件在快速路径分配中判断。/* * 快速路径分配的简化逻辑 * 展示kswapd唤醒的判断流程 */ static inline bool need_kswapd_wakeup(struct zone *zone, int order) { unsigned long watermark; long free_pages; /* 获取对应阶的水位线高阶分配需要更高的水位 */ watermark zone-watermark[WMARK_LOW]; if (order 0) watermark (1 order); free_pages zone_page_state(zone, NR_FREE_PAGES); /* 空闲页低于low水位线时唤醒kswapd */ if (free_pages watermark) return true; return false; }kswapd唤醒逻辑已高度适应不同分配阶。order为0的分配仅需超过low水位线。高阶分配需要额外空闲页余地。3.2 kswapd的回收循环kswapd被唤醒后进入balance_pgdat()。目标是使所有zone的空闲页都恢复到high水位线以上。回收过程中持续检查是否达到目标。kswapd的平衡逻辑非常务实。它不追求精确的high水位线。只要所有zone都超过high就停止回收。这是性能与效果之间的最优平衡点。四、直接回收的触发时机与工程实践4.1 直接回收路径当快速路径分配失败时进入慢速路径。慢速路径中包含直接回收(direct reclaim)。/* * 慢速路径分配的核心逻辑示意 * 展示direct reclaim的触发条件 */ static struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, struct alloc_context *ac) { struct page *page NULL; unsigned int alloc_flags; bool can_direct_reclaim gfp_mask __GFP_DIRECT_RECLAIM; if (!can_direct_reclaim) goto nopage; /* 尝试直接回收内存 */ page __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac, did_some_progress); if (page) goto got_pg; /* 回收未能满足需求时进行二次尝试 */ page __alloc_pages_direct_compact(gfp_mask, order, alloc_flags, ac, compact_priority, compact_result); if (page) goto got_pg; nopage: /* 所有努力失败尝试OOM killer */ page __alloc_pages_may_oom(gfp_mask, order, ac, did_some_progress); got_pg: return page; }4.2 直接回收的性能影响直接回收在调用进程的上下文中同步执行。这意味着应用程序会被阻塞等待回收完成。这正是水位线设计要极力避免的场景。生产环境中应密切关注直接回收频率。可使用以下命令监控grep -E pgsteal_direct|pgscan_direct /proc/vmstatpgscan_direct数值持续增长意味着直接回收活跃。此时应考虑增加min_free_kbytes或添加物理内存。4.3 调优实践内存压力下的调优遵循以下原则优先增加物理内存这是根本解决方案。其次调整min_free_kbytes提升水位线基准。最后考虑调整vm.swappiness影响回收倾向。五、总结水位线机制是Linux内存管理的核心调度器。三条水位线构成递进式内存压力响应体系。min水位线是最后防线触发同步直接回收。low水位线是预警线唤醒kswapd异步回收。high水位线是kswapd的回收停止目标。水位线比例关系基于min_free_kbytes建立。内核模块可实时观测各zone的水位线状态。生产环境中通过vmstat监控直接回收频率。调优应优先从物理内存和min_free_kbytes入手。

相关新闻

计算机网络·第八章自测题精讲:Internet接入技术全解析——ADSL、光纤接入、无线接入与网格计算(含答案与解析)

计算机网络·第八章自测题精讲:Internet接入技术全解析——ADSL、光纤接入、无线接入与网格计算(含答案与解析)

2026/8/22 19:55:03

第八章自测一、单选题1.目前 Internet 接入技术主要有:基于传统( )的有线接入、基于有线 电视网接入、以太网接入、无线接入技术和光纤接入技术。 A. 数据网 B. 数字网 C. 有线网 D. 电信网 正确答案:D 目前 Intern…

助睿实验7-3:可视化探索

助睿实验7-3:可视化探索

2026/8/26 16:19:37

实验7-3:可视化探索4.1 分析框架由于数据特点为内容同质化、平台固定、标题是主要差异来源,因此分析聚焦于5个维度:核心指标:整体表现如何?排名分析:谁做得好?什么内容做得好?标题影…

【深度】说在美国AI泡沫破裂之前,中国将赢在最后

【深度】说在美国AI泡沫破裂之前,中国将赢在最后

2026/8/25 12:44:59

训练侧90%坚如磐石,推理侧墙根被挖。AI价值正在纵向转移。英伟达要完蛋了吗?英伟达的大客户都跑了这可怎么办?AI泡沫要破裂了吗?破裂了之后会怎么样?谁是最后的赢家?今天一次性讲透。答案可能出乎你意料——…

C++全排列算法(STL)

C++全排列算法(STL)

2026/8/30 11:51:52

文章目录1.next_permutation2.prev_permutationSTL提供了两个用来计算排列组合关系的算法&#xff0c;分别是next_permutation和prev_permutation。1.next_permutation //获得之后的字典序 #include<iostream> #include<algorithm> using namespace std; int a[3]…

英伟达算力生态全解析:从云端API调用到NIM自部署实战

英伟达算力生态全解析:从云端API调用到NIM自部署实战

2026/8/30 11:51:52

最近科技圈除了各家大模型版本更新之外&#xff0c;还有一条商业消息值得关注&#xff1a;消息称英伟达暂停了与多家 AI 公司的收益分成协议&#xff0c;目的是规避反垄断审查。很多开发者看到这类新闻&#xff0c;第一反应是“这是商业资本层面的事&#xff0c;跟我有什么关系…

荣耀最新的手机adb无法连接的问题

荣耀最新的手机adb无法连接的问题

2026/8/30 11:51:52

当选择文件传输时&#xff0c;无法adb连接&#xff0c;当选择Midi设备时可以连接。 在linux下用使用lsusb观察,当接入"选择Midi设备"时其vid为0e8d 当接入"文件传输"时其vid为339b lsusb 里的格式是&#xff1a; ID VID:PID 所以这条&#xff1a; ID 1…

字节跳动客户端实习笔试全解析:考点、编程题与代码习惯

字节跳动客户端实习笔试全解析:考点、编程题与代码习惯

2026/8/30 11:51:52

字节跳动2017客户端工程师实习生笔试题&#xff0c;我当年是真刀真枪考过的。那会儿今日头条已经火到不行&#xff0c;身边投客户端实习岗位的同学一大片&#xff0c;笔试链接发过来的时候我还挺紧张。整场考试90分钟&#xff0c;Web编辑器&#xff0c;没有IDE提示&#xff0c;…

Echo Dot 2改造:树莓派+本地LLM打造离线语音终端

Echo Dot 2改造:树莓派+本地LLM打造离线语音终端

2026/8/30 11:51:52

手上有一台吃灰多年的 Echo Dot 2&#xff0c;原以为它只能当个语音闹钟&#xff0c;或者连上蓝牙放点背景音乐。最近看了不少国外开发者把老智能音箱改造成离线语音助手的案例&#xff0c;决定自己也试一把&#xff1a;把 Echo Dot 2 的麦克风、扬声器和外壳利用起来&#xff…

Remotion 视频检索:10分钟给视频装上全文搜索

Remotion 视频检索:10分钟给视频装上全文搜索

2026/8/30 11:41:51

Remotion 视频检索&#xff1a;10分钟给视频装上全文搜索 【免费下载链接】remotion &#x1f3a5; Make videos programmatically with React 项目地址: https://gitcode.com/GitHub_Trending/re/remotion 昨晚整理一场 90 分钟的分享录像&#xff0c;我需要找到提到「…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学&#xff0c;看到最多的状态就是&#xff1a;简历上写着“熟悉 MySQL”“了解索引优化”&#xff0c;一碰到数据库管理工程师的笔试卷&#xff0c;却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事&#xff1a;时间参数到底在约束什么你翻过数字电路教材&#xff0c;一定见过这两个词&#xff1a;建立时间&#xff08;Setup Time&#xff09;和保持时间&#xff08;Hold Time&#xff09;。它们常被并列写在触发器&#xff08;Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起&#xff1a;从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目&#xff0c;我至今记忆犹新。它没有直接给出一个花哨的名字&#xff0c;而是用“超声波测距机”这个朴实无华的功能描述&#xff0c;精准地勾勒出了考核的核心。对于当时备赛的我而言…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学&#xff0c;看到最多的状态就是&#xff1a;简历上写着“熟悉 MySQL”“了解索引优化”&#xff0c;一碰到数据库管理工程师的笔试卷&#xff0c;却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事&#xff1a;时间参数到底在约束什么你翻过数字电路教材&#xff0c;一定见过这两个词&#xff1a;建立时间&#xff08;Setup Time&#xff09;和保持时间&#xff08;Hold Time&#xff09;。它们常被并列写在触发器&#xff08;Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起&#xff1a;从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目&#xff0c;我至今记忆犹新。它没有直接给出一个花哨的名字&#xff0c;而是用“超声波测距机”这个朴实无华的功能描述&#xff0c;精准地勾勒出了考核的核心。对于当时备赛的我而言…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…