计算机原理—damon冷热内存和自动化识别

一、内存使用

从有计算机以来,内存就是一项非常重要的资源。如何高效、便捷、合理的提高内存的使用率,一直是一个让所有计算机技术的开发者重视的问题。硬件上,不断突破新技术,提高内存的容量和访问速度;软件上不断利用各种技术实现内存的重用、映射等相关实现。而在软件和硬件的连接方,操作系统上,更是在保证安全的前提下,不断的采用各种技术来压榨内存应用的极限。特别是防止经典的OOM的出现。

二、damon和冷热内存

要想明白Damon,首先要明白冷热内存。所谓冷热内存,不是指的物理上的内存的温度的高低,它指的是使用频率。这和传统的内核中使用各种内存回收机制中的各种内存回收机制如LRU(最近最少使用)其实相类似的。使用的多,就代表热度高,反之,则代表冷。调度系统就可以根据这种冷热的判断来确定哪些内存页是可以换出甚至是回收的。从而对其进行再利用。

Linux 7.1中的DAMON(Data Access MONitor)是一个轻量级、可扩展的内存访问监控框架,它通过核心机制DAMOS(DAMON-based Operation Schemes)将监控结果转化为自动化的内存管理操作,实现了从"被动响应"到"主动预防"的转变。

"DAMON冷热内存"和"自动化识别"其实不是两个并列的技术,而是同一套机制的两个层次‌------DAMON负责"监视"(识别冷热),DAMOS负责根据监视结果进行"处理"(自动化处置)。

那么Damon到底解决了传统的内存管理的什么问题呢?在传统的内存管理技术中,传统的内存管理技术如LRU+访问标记的方式,往往存在着以下的缺陷:

  1. 内存管理的粒度较粗而且属于被动触发管理,无法在空闲时甚至实时的进行内存的主动优化
  2. 相关的内存管理如LRU无法获取真实的访问频繁即LRU等只有active/inactive两个状态,无法具体的描述内存页的冷热
    Damon则可以做到这一切,它可以准确回答内存页在哪段时间被访问的有多频繁。它的设计思路如下:
  3. 精度足够支持DRAM级别内存管理决策(但不适合CPU Cache级别)
  4. 自向轻量,可以在线上长期运行,系统开销非常低(低于千分之一以下)
  5. 其性能开销是一个常量级的描述,不会因为监控范围的加大而增加开销,可扩展性强

Damon系统是AWS的SeongJae Park开发,它早在Linux 5.15就已经进入了内核,但一直在不断的发展、更新。直到Linux 7.1,才有一个系统性的完整版本。

三、原理和分析

大家都知道,想要明白运行时的资源消耗状态,最简单的方式就是不断的遍历查询相关的资源使用情况。但这也是最不可取的一种机制,不断的遍历会导致CPU资源的消耗殆尽。这种以死道友不死贫道的方式实现的资源管理,没有什么意义。同样,在内存管理中亦是如此。早期的内存管理为什么使用被动机制,一个重要原因也是这个。

Damon识别冷内存不靠遍历扫描,而靠分区采样加自适应调整的机制来高效的达到同样的目的。其主要的方式如下:

  1. 内存Region分区采样
    这和传统的内存池分块没有本质区别,Damon把监控的内存空间划分成若干个连续的Region。根据局部性原理,同一个Region内的页访问频率相近。因此只需要抽查每个Region中的任意一个页面访问位即可,不必进行整体的遍历,就能得到当前整个Region的热度
  2. 自适应区域调控
    在实际的运行过程中,内存会分配释放,反复多次。有可能产生相关位置的飘移。这就需要damon通史动态的合并访问热度相似的邻近内存区域并分割一些访问热度差异过大的Region。但要在整体上控制Region的数量在100~1000个左右。即将精度和开销的平衡做到最优。同时,为了保证独立性和对内核的隔离,Damon使用了PG_idle/PG_young标志来规避对 Accessed位的冲突操作
  3. 基于VMA的智能聚焦
    对于PC中的虚拟内存而言,往往存在着大片的未映射区域(未使用),Damon为了提高监控的效率,将VMA划分为堆、栈和mmap三块重点区域,而对未映射区域则主动略过(两大段的unmmap空洞即堆和mmap区域之间的未映射空间以及mmap区域和栈之间的未映射空间)。Damon会在Regions定时更新后(更新周期)重新初始化相关的区域
  4. 多种监控目标
    Damon会对特定进程的虚拟空间(vaddr)和整机的物理地址空间(pddr)实施监控,即在进程级别和整体层级上分别进行监控。另外它还可以通过内核指定的虚拟地址(fvaddr)范围进行监控

对于Damon来说,其配置也相对简单,它只包含采样间隔、聚合间隔、更新间隔、最小/最大region数几个相关的参数设置.每经过一个对聚合周期(aggregation interval)后,Damon会对采样结果进行输出,形成对冷热内存访问频繁的画像。从未访问的温度为负值,访问越少的则温度越低。

DAMON中,真正执行监控任务的是DAMOS引擎(DAMon-based Operation Schemes)。它让内核和用户态无需编写代码而只需要配置相关的参数即可基于访问模式自动操作系统。它主要包括:

  1. 冷热阈值的自动识别
    用户需要提前设定冷热判断的阈值,从而有据可依。一般来说,Region的判定为hot_thres_access_freq(默认50%)判断为热区;Region在超过阈值时间如min_age/cold_min_age(默认120秒)内无访问,判为冷区
  2. 自动化行为
    这些自动化的任务操作行为包括:
  • DAMOS_PAGEOUT:换出冷页,用于内存的主动回收
  • DAMOS_LRU_PRIO:提升或降低LRU的优先级,用于让LRU更可信
  • DAMOS_MIGRATE_HOT:冷热页跨层迁移,用来对内存进行分层,如DRAM与CXL/PMEM
  • DAMOS_HUGEPAGE:组织大页,用来提升TLB的命中率
  • DAMOS_MTHP_SPLIT:拆分大页,用于冷大页的拆分以节省内存
  1. 内核相关模块
    为了支持DAMON,内核也提供了相关的模块:
  • DAMON_RECLAIM‌:轻内存压力下的主动回收,用三个内存水位(high/mid/low)自动激活/停用,配额(quota)限制 CPU与IO消耗
  • DAMON_LRU_SORT‌:主动整理LRU链表,让LRU成为更可信的访问模式来源,默认参数保守可直接用
  1. 用户态工具
    为了便于用户上层的叫什么,Damon提供了相关的官方工具damo,它可以通过sysfs接口直接操作DAMON,提供包括start/record/report heatmap/access等命令来把监控结果可视化为热力图或直方图等便于观察分析的UI界面

与早期的damon相比,内核7.1的Damon有以下几个新特点:

  1. 从被动管理到主动分层
    早期的Damon需要繁琐的手动参数处理,而新的Damon则引入的基于目标的自动调优,系统可根据设定的内存利用率等目标进行动态调整相关的策略
  2. 从监控到管理
    最初发Damon只是一个监控框架,而到如今它主动的页面迁移和回收等操作,可以直接优化系统性能
  3. 从通用到精细化
    监视的粒度从原来的区域到现在的支持页面级监控,同时也给出更多的策略用来细化对NUMA节点 甚至内存控制组进行精细化的管理
  4. 精度与开销的平衡
    这才是damon的典型优势,其通过区域采在唯精度的前提下,实现了常数级的开销

四、DRAM和CXL混合内存系统

谈到Damon,就不得不扩展一下DRAM + CXL等混合内存系统。正如前面所分析,内存资源是昂贵的,如何更新的利用内存及其扩展,则成为了计算机技术的一个重要的应用场景。一个很合理的想法是,可不可以好钢用在刀刃上,普钢在刀身上。这就是CXL,Compute Express Link,高速互联协议。它是2019年由英特尔牵头、行业主流厂商联合推出的‌开放标准缓存一致性互联协议‌,专门解决传统内存扩展的瓶颈问题。

CXL基于成熟的PCIe物理层构建,在普通PCIe的I/O语义之上新增了缓存一致性能力,让CPU访问外接设备内存时,体验几乎和访问本地DRAM一致,而不是传统PCIe外设的块设备访问模式,最新的CXL 4.0在2025年11月发布,传输速率达到‌128 GT/s‌,带宽已经远超主流PCIe 5.0的水平。

CXL包含三个核心子协议即CXL.io(基础设备发现)、CXL.cache(加速器缓存主机内存)、CXL.mem(主机直接字节级访问外接CXL内存)。

在明白了CXL后,再回到内存的应用。内存主流的当然是DRAM,它速度快、容量相对大。但随着计算机应用的发展,对内存的渴求是越来越大,特别是AI技术技术的发展,就连普通电脑用户都感觉到了对内存需求的可怕程度(内存价格在疯涨)。再联想到CXL,设计者是不是可以把内存通过CXL进行扩展分层。根据Damon的冷热判断结果将热内存存放在DRAM中,而将冷内存转移到CXL扩展的内存中去。这也是一种另外的平衡机制(核心和交换内存有点相似)。

在内核的7.1版本中,提供了自动交织调节的配置,可以更加智能的进行内存的分层,从而更好的利用DRAM和CXL的内存,最大效率的利用CXL的并行带宽。当开启内存压力自适应模式后,DRAM的使用率超过85%后,会自动提升冷页下沉的触发频率(换到CXL内存),从而有效的避免OOM的风险。

再顺带简单介绍一下CXL常见的内存,它可以使用高低版本的DRAM,如在CXL扩展卡上封装使用相同或低版本的DRAM;也可以使用PMEM持久内存介质,让数据可以持久化实现类似SSD硬盘的数据存储;当然也可以混合使用上述的两种情况。目标只有一个,实现内存的扩展,越大越好。

具体的应用包括三星CXL Memory Expander、英特尔CXL 3.1 PMEM以及国产的一些相关厂商的产品,有兴趣的可以搜索查看。

五、优缺点和应用

  1. 优势
    对于Damon来说,其之所以被整合到内核中来,有着很多的优点:
  • 开销极低‌(<0.1%)且上限恒定,可长期在线
  • 精度足够支撑DRAM级决策‌,冷热识别比LRU可信得多
  • 完全非侵入‌,不需要改业务代码,靠页表信息即可
  • 可编程策略‌,DAMOS让运维用配置而非写内核代码实现策略
  • 原生内核态‌,迁移/回收动作在内核内完成,节省了用户态搬运开销
  1. 不足
    但同样,它也存在着不足:
  • 不适用于CPU Cache级‌管理(官方明确说明精度不够)
  • region级近似‌,是一种假设区内页频率相近,访问极不均匀时精度下降
  • 单线程瓶颈‌,分层任务中单线程太慢(TPP-DAMON 因此转多线程)
  • 调参有门槛‌,采样/聚合间隔、冷热阈值、配额需按负载tune,参数不当效果打折
  • 存在边界bug风险‌,社区曾修复参数未校验导致的除零、负尺寸区域、越界访问等问题,说明其动态区域逻辑较复杂
    与NUMA balancing存在潜在策略冲突‌(需精心设定目标避免)
  1. 应用
    其常见的应用场景如下:
  • 异构内存分层‌,DRAM + CXL/PMEM,热页留DRAM、冷页下沉(如内存数据库Redis + YCSB 实测吞吐‌+11.6%‌)
  • 内存超售的虚拟化环境‌,客户机主动回收冷页、提升内存利用率
  • 大型系统的主动LRU整理‌,可降低内存压力下的延迟尖峰和OOM风险
  • AI/大模型推理‌TPP-DAMON在llama.cpp上性能提升显著

一般来说,它在对延迟极度敏感且工作集完全静态的场景(此时静态numactl绑定可能更简单可靠),以及小内存系统(收益有限)则不太合适。

六、总结

Damon的核心是通过用户具备一定的参数调优能力和对动态内存行为的理解,实现内存管理从被动应付到主动精确操作的优化控制。

Linux 7.1中的DAMON经过了漫长的发展,已经从一个单纯的监控工具,演化为一个高度自动化、场景化的内存管理核心组件,特别是在异构内存和分层存储日益普及的背景下,它提供了一套从精准观察到智能执行的完整解决方案。

相关推荐
weifont2 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
信可维6 小时前
自动化操作多平台账号:登录态、双会话与 User Data 的 3 个坑
运维·自动化
傲世仙尊7 小时前
类和对象中-构造函数与析构函数把初始化清理自动化
java·运维·自动化
2302_805771079 小时前
Day20:实战:接口自动化测试框架封装之一------接口关联封装
功能测试·自动化·测试用例
奈落2412 小时前
AI 办公助手选型指南:从聊天问答到主动式工作流,企业办公自动化该怎么挑、边界在哪
人工智能·自动化·工作流·ai 办公
天远Date Lab12 小时前
零信任架构实战:基于天远风控经营异常预警构建自动化商业园区租户巡检网关
大数据·人工智能·架构·自动化