资讯动态

Linux 内核 DAMON 快速上手:使用 DAMO 工具完成数据访问模式监控与内存管理

发布时间:2026/9/10 17:17:02 来源:尧图企业网站定制
Linux 内核 DAMON 快速上手使用 DAMO 工具完成数据访问模式监控与内存管理【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文是 Linux 内核DAMONData Access MONitor子系统的入门实战指南核心素材取自内核文档 Documentation/admin-guide/mm/damon/start.rst。你将学会在内核开启CONFIG_DAMON_*的前提下通过官方用户态工具 DAMO 完成进程内存访问模式的快照查看、持续记录、可视化分析并基于访问模式编写“自动换出冷页”等内存管理策略。读完即可在真实工作负载上复现文中全部命令。前置条件内核配置与用户态工具内核开启 CONFIG_DAMON_* 系列选项DAMON 是内核内置的子系统使用前必须确认当前内核已开启相关配置即CONFIG_DAMON_*y。以仓库中的 mm/damon/Kconfig 为例涉及的配置项包括CONFIG_DAMONDAMON 框架本体负责以可控开销监控每个内存区域的访问频率CONFIG_DAMON_VADDR面向虚拟地址空间进程的监控操作集默认随DAMON开启依赖MMU并会选中PAGE_IDLE_FLAGCONFIG_DAMON_PADDR面向物理地址空间的监控操作集同样是默认开启项CONFIG_DAMON_SYSFSDAMON 的 sysfs 用户接口DAMO工具正是基于它工作CONFIG_DAMON_RECLAIM/CONFIG_DAMON_LRU_SORT/CONFIG_DAMON_STAT面向回收、LRU 排序、访问统计等专用场景的内核模块CONFIG_DAMON_KUNIT_TEST、CONFIG_DAMON_SYSFS_KUNIT_TEST、CONFIG_DAMON_VADDR_KUNIT_TESTKUnit 单元测试测试源码位于 mm/damon/tests/。对应的编译产物关系可参见 mm/damon/Makefilecore.o无条件编译vaddr.o、paddr.o、sysfs.o等分别由上述配置项控制。用户态工具DAMON OperatorDAMO演示使用 DAMON 的默认用户态工具DAMODAMON Operator。下方示例均假设damo已加入$PATH非强制。由于 DAMO 底层读写的是 DAMON 的 sysfs 接口细节见 Detailed Usages请确认 sysfs 已挂载Linux 发行版默认挂载于/sys相关说明见 sysfs 文档。DAMON 接口分四层理解后更便于把握 DAMO 的行为专用内核模块DAMON_RECLAIM等构建、分发、管理内核时以极简方式使用 DAMONDAMO 用户态工具适合系统管理员的人性化界面sysfs 接口/sys/kernel/mm/damon/面向特权用户空间程序可用脚本封装内核编程接口见 Documentation/mm/damon/api.rst内核空间程序员可扩展任意地址空间。快照查看获取某一时刻的数据访问模式以下命令展示一个程序在执行瞬间的内存访问模式$ git clone https://github.com/sjp38/masim; cd masim; make $ sudo damo start ./masim ./configs/stairs.cfg --quiet $ sudo damo report access heatmap: 641111111000000000000000000000000000000000000000000000[...]33333333333333335557984444[...]7 # min/max temperatures: -1,840,000,000, 370,010,000, column size: 3.925 MiB 0 addr 86.182 TiB size 8.000 KiB access 0 % age 14.900 s 1 addr 86.182 TiB size 8.000 KiB access 60 % age 0 ns 2 addr 86.182 TiB size 3.422 MiB access 0 % age 4.100 s 3 addr 86.182 TiB size 2.004 MiB access 95 % age 2.200 s 4 addr 86.182 TiB size 29.688 MiB access 0 % age 14.100 s 5 addr 86.182 TiB size 29.516 MiB access 0 % age 16.700 s 6 addr 86.182 TiB size 29.633 MiB access 0 % age 17.900 s 7 addr 86.182 TiB size 117.652 MiB access 0 % age 18.400 s 8 addr 126.990 TiB size 62.332 MiB access 0 % age 9.500 s 9 addr 126.990 TiB size 13.980 MiB access 0 % age 5.200 s 10 addr 126.990 TiB size 9.539 MiB access 100 % age 3.700 s 11 addr 126.990 TiB size 16.098 MiB access 0 % age 6.400 s 12 addr 127.987 TiB size 132.000 KiB access 0 % age 2.900 s total size: 314.008 MiB $ sudo damo stop第一步下载并构建masim——一个人工内存访问模式生成器。第二步damo start让 DAMO 按给定命令启动程序并让 DAMON 监控该新进程第三步damo report access从 DAMON 拉取被监控进程的当前访问模式快照并以人类可读格式展示第四步damo stop停止 DAMON。输出解读第一行 heatmap以单行热图展示各区域的相对访问温度热度。每一列代表被监控虚拟地址空间中相同大小的区域列的位置表示区域的相对地址位置列上的数字表示访问温度[...]表示虚拟地址空间中未映射的巨大区域。第二行补充信息最小/最大温度、每列对应的大小。第三行起的每一行描述进程的某个虚拟地址范围addr XX size XX在多久内age XX被多频繁地访问access XX %。例如示例中第 10 个约 9.5 MiB 的区域在过去 3.7 秒内被最频繁访问100%。注意DAMON 不仅能监控虚拟地址空间还支持包括物理地址空间在内的多种地址空间类型对应vaddr、fvaddr、paddr三种操作集详见 Design 中的 Operations Set 章节。持续记录将访问模式保存到文件快照只能反映瞬间状态若想长时间跟踪可把监控结果记录到文件$ ./masim ./configs/zigzag.cfg $ sudo damo record -o damon.data $(pidof masim)第一行再次运行人工访问生成器——它会反复交替访问两个 100 MiB 大小的内存区域实践中可替换为真实工作负载。第二行让damo把访问模式记录到damon.data文件。可视化热图与工作集大小分布访问热图x 轴空间y 轴时间$ sudo damo report heatmap 22222222222222222222222222222222222222211111111111111111111111111111111111111100 44444444444444444444444444444444444444434444444444444444444444444444444444443200 44444444444444444444444444444444444444433444444444444444444444444444444444444200 33333333333333333333333333333333333333344555555555555555555555555555555555555200 33333333333333333333333333333333333344444444444444444444444444444444444444444200 22222222222222222222222222222222222223355555555555555555555555555555555555555200 00000000000000000000000000000000000000288888888888888888888888888888888888888400 00000000000000000000000000000000000000288888888888888888888888888888888888888400 33333333333333333333333333333333333333355555555555555555555555555555555555555200 88888888888888888888888888888888888888600000000000000000000000000000000000000000 88888888888888888888888888888888888888600000000000000000000000000000000000000000 33333333333333333333333333333333333333444444444444444444444444444444444444443200 00000000000000000000000000000000000000288888888888888888888888888888888888888400 [...] # access_frequency: 0 1 2 3 4 5 6 7 8 9 # x-axis: space (139728247021568-139728453431248: 196.848 MiB) # y-axis: time (15256597248362-15326899978162: 1 m 10.303 s) # resolution: 80x40 (2.461 MiB and 1.758 s for each character)热图直观呈现“哪个内存区域x 轴在什么时候y 轴被访问、多频繁数字”。末尾注释行给出访问频率数值范围、x/y 轴的实际地址与时间跨度、以及每个字符对应的分辨率。工作集大小WSS分布按大小排序查看工作集working set分布$ sudo damo report wss --range 0 101 10 # percentile wss # target_id 18446632103789443072 # avr: 107.708 MiB 0 0 B | | 10 95.328 MiB |**************************** | 20 95.332 MiB |**************************** | 30 95.340 MiB |**************************** | 40 95.387 MiB |**************************** | 50 95.387 MiB |**************************** | 60 95.398 MiB |**************************** | 70 95.398 MiB |**************************** | 80 95.504 MiB |**************************** | 90 190.703 MiB |********************************************************* | 100 196.875 MiB |***********************************************************|每行输出一个百分位点对应的工作集大小。结合--sortby选项可以查看工作集大小的时间演化$ sudo damo report wss --range 0 101 10 --sortby time # percentile wss # target_id 18446632103789443072 # avr: 107.708 MiB 0 3.051 MiB | | 10 190.703 MiB |***********************************************************| 20 95.336 MiB |***************************** | 30 95.328 MiB |***************************** | 40 95.387 MiB |***************************** | 50 95.332 MiB |***************************** | 60 95.320 MiB |***************************** | 70 95.398 MiB |***************************** | 80 95.398 MiB |***************************** | 90 95.340 MiB |***************************** | 100 95.398 MiB |***************************** |这种信息对容量规划、缓存策略设计、云环境下的内存资源估算非常有价值。访问模式感知的内存管理DAMOSDAMON 的价值不仅在于“看”更在于“做”。下面的命令让 DAMON 把工作负载中所有大小 4K、且 60 秒未被访问的内存区域换出pageout$ sudo damo start --damos_access_rate 0 0 --damos_sz_region 4K max \ --damos_age 60s max --damos_action pageout \ --target_pid pid of your workload参数语义与 sysfs 下的 DAMOSDAMON-based Operation Schemes一一对应可对照 usage.rst 中schemes/N/access_pattern/的sz、nr_accesses、age三个维度min/max 闭区间以及action文件理解--damos_sz_region 4K max区域大小区间为[4K, max]--damos_access_rate 0 0每个聚合周期内访问次数为[0, 0]即完全未被访问--damos_age 60s max当前访问模式维持时间 60s即持续冷--damos_action pageout对命中区域执行换出动作。更多 DAMOS 动作与约束机制动作action除pageout外还有stat仅统计、hugepage、madvise、migrate_hot/migrate_cold内存迁移配合target_nid与dests/多目标等完整列表见内核头文件 include/linux/damon.h 中enum damos_action的定义。配额quotasquotas/ms时间配额毫秒、quotas/bytes大小配额字节、quotas/reset_interval_ms重置周期用于限制动作的开销权重weights/{sz,nr_accesses,age}_permil决定配额内优先处理哪类区域。水位线watermarkswatermarks/metricnone或free_mem_rate、interval_us、high/mid/low实现“内存压力轻时停止、压力大时启动”的自适应启停。过滤器filterscore_filters/ops_filters可按anon、memcg、addr、hugepage_size、target等类型配合matching、allow精细限定动作作用范围。sysfs 完整目录层级kdamonds → contexts → targets / monitoring_attrs / schemes见 Detailed Usages 中的 Files Hierarchy 图示更底层的执行模型与数据结构请参考 Documentation/mm/damon/design.rst。底层原理速览DAMON 如何做到“高效”结合 mm/damon/ 源码与 Design 文档DAMON 的核心机制可概括为四点区域采样Region Based Sampling将相邻且访问频率相近的页合并为区域每个采样周期只随机抽查每区域中的一个页基于 PTE Accessed bitnr_accesses计数器累加区域访问次数。监控开销由区域数量上下限monitoring_attrs/nr_regions的 min/max控制实现开销与精度的可调权衡。自适应区域调整Adaptive Regions Adjustment每个聚合周期比较相邻区域访问频率差异小则合并、必要时分裂动态保持“区域内部访问相似”的假设在用户设定的区域数边界内提供 best-effort 质量。年龄跟踪Age Tracking若区域大小与访问频率未显著变化则age递增否则清零——这正是--damos_age 60s判断“冷多久”的依据。执行模型每个监控上下文context由一个内核线程kdamond执行支持多 kdamond 并行与暂停/恢复sysfsstate文件写入on/off/commit等关键字控制。小结本文完整走通了 DAMON 的入门流程配置内核 → 安装 DAMO → 快照访问模式 → 记录并可视化 → 编写访问模式感知的内存管理策略。若需在生产环境使用官方推荐优先使用 DAMO 这类用户态工具而非手工读写 sysfs 文件更深度的参数聚合间隔调优、配额自动调整、tracepoint 结果采集等可继续阅读 Detailed Usages 与 Design以及damo工具自身的使用文档。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价