一:简介

DAMON :Data access monitor。是Linux kernel新提供的内存访问监控框架。它的核心思想是使用一种采样(sampling)技术来确定哪些内存是正在使用的,哪些是正在闲置的。进程的虚拟地址空间或者全局物理地址被分成不同的区域(region),划分出来的区域的 size 并不相同,而是根据活跃情况来划分的。接下来随着时间的推移会对最繁忙的区域进行更细地划分,从而进行更精细的监控。在每个区域内会随机选择一个 page 进行监控,它的活跃程度就被认为是代表了整个区域的情况。在需要的时候,DAMON 会以直方图(histogram)的形式生成一份报告来报告每个内存区域的繁忙程度。最后可以根据设置的条件对内存进行回收。

二:整体实现

采样周期,sample_interval:指每次数据采集的间隔。

统计周期,aggregations_interval:指采样一段时间后,汇总数据的周期。

Damon监控进程运行的函数是kdamond_fn,也是实现监控架构的主要逻辑。

数据结构关系:

三:Damon实现细节

1:prepare access check

采样之前需要执行prepare_access_checks,遍历ctx中的target包含的region,为每个region确定采样地址,然后调用mkold函数,去掉page中的标签。

static void __damon_va_prepare_access_check(struct damon_ctx *ctx,struct mm_struct *mm, struct damon_region *r)
{r->sampling_addr = damon_rand(r->ar.start, r->ar.end);//随机获region中的地址damon_va_mkold(mm, r->sampling_addr);//mkold函数去掉标签
}

虚拟地址的mkold函数实现: 物理地址类似

void damon_ptep_mkold(pte_t *pte, struct mm_struct *mm, unsigned long addr)
{bool referenced = false;struct page *page = damon_get_page(pte_pfn(*pte));if (!page)return;if (pte_young(*pte)) {referenced = true;*pte = pte_mkold(*pte);//去掉pte的_PAGE_ACCESSED flag}
#ifdef CONFIG_MMU_NOTIFIERif (mmu_notifier_clear_young(mm, addr, addr + PAGE_SIZE))referenced = true;
#endif /* CONFIG_MMU_NOTIFIER */if (referenced)set_page_young(page);//如果pte刚被访问就设置young flagset_page_idle(page); //mkold主要设置page idle.put_page(page);
}

2:check access

采样期间,检测sample address是否被访问。

static void __damon_va_check_access(struct damon_ctx *ctx,struct mm_struct *mm, struct damon_region *r)
{/*避免重复检查*/if (mm == last_mm && (ALIGN_DOWN(last_addr, last_page_sz) ==ALIGN_DOWN(r->sampling_addr, last_page_sz))) {if (last_accessed)r->nr_accesses++;return;}//damon_va_young函数确定这个地址是否被访问过。last_accessed = damon_va_young(mm, r->sampling_addr, &last_page_sz);if (last_accessed)r->nr_accesses++;last_mm = mm;last_addr = r->sampling_addr;
}测试page(va,pa都一样)是否被访问主要是通过如下逻辑代码:if (pte_young(*pte) || !page_is_idle(page) ||mmu_notifier_test_young(walk->mm, addr)) {*priv->page_sz = PAGE_SIZE;priv->young = true;  //代表page被访问过}
主要根据页表访问会设置pte为young来判断。

3:apply schemes

统计周期结束后,对满足采样条件的区间执行对应的策略。

scheme->action由用户指定对应的策略,比如换出内存。最后调用madvise相关的函数实现。

Reclaim模块的话是直接调用shrink_page_list回收物理内存。如下代码是虚拟内存相关。

static int damon_va_apply_scheme(struct damon_ctx *ctx, struct damon_target *t,struct damon_region *r, struct damos *scheme)
{int madv_action;switch (scheme->action) {case DAMOS_WILLNEED:madv_action = MADV_WILLNEED;break;case DAMOS_COLD:madv_action = MADV_COLD;break;case DAMOS_PAGEOUT:madv_action = MADV_PAGEOUT;break;case DAMOS_HUGEPAGE:madv_action = MADV_HUGEPAGE;break;case DAMOS_NOHUGEPAGE:madv_action = MADV_NOHUGEPAGE;break;case DAMOS_STAT:return 0;default:pr_warn("Wrong action %d\n", scheme->action);return -EINVAL;}return damos_madvise(t, r, madv_action);
}

4:split region

每次统计周期结束后,会对region进行调整。主要根据用户设置参数来调节。比如min_nr_regions。同时会合并相邻的访问次数相同的区间,为了降低负载。

四:damon相关的配置参数

aggr_interval:统计间隔

sample_interval:采样间隔

wmarks_high:free memory in bytes per thousand bytes is higher than this, DAMON_RECLAIM becomes inactive,

wmarks_mid:free memory in bytes per thousand bytes is between this and the low watermark, DAMON_RECLAIM becomes active.

wmarks_low: lower than this, DAMON_RECLAIM becomes inactive,

monitor_region_start/end:监控的起始地址,进程会自动获取。

max/min_nr_regions:最大,最小的region数量,现在region的数目。

min_age:最小的年龄。age是个有意思的度量,代表访问次数变化小于阈值的情况下,经历了多少次统计周期。阈值设置为region的max_nr_accesses / 10。 可以简单理解为相同的访问次数下,经历了多少个统计周期。访问变化后age清零。

quota前缀用于限制damon。

五:Damon相关使用

damon参考:

Detailed Usages — The Linux Kernel documentation

damon_reclaim参考:

DAMON-based Reclamation — The Linux Kernel documentation

kernel Damon实现相关推荐

  1. linux data access monitor(DAMON)

    ­­­­­­­­DAMON(data access monitor)简介: 第一个版本提交时间为2020/1/10,功能在持续不断的完善. DAMON是一个用于Linux内核的数据访问监控框架子系统, ...

  2. LWN:用DAMON来优化memory-management!

    关注了就能看到更多这么棒的文章哦- Memory-management optimization with DAMON By Jonathan Corbet February 20, 2020 原文来 ...

  3. 在 CUDA C/C++ kernel中使用内存

    在 CUDA C/C++ kernel中使用内存 如何在主机和设备之间高效地移动数据.本文将讨论如何有效地从内核中访问设备存储器,特别是 全局内存 . 在 CUDA 设备上有几种内存,每种内存的作用域 ...

  4. linux内核开机显示企鹅logo,批改linux内核kernel开机logo(小企鹅)

    修改linux内核kernel开机logo(小企鹅) 修改linux内核kernel的开机图片(原为小企鹅图片). 转载请注明出处:http://blog.csdn.net/wang_zheng_ka ...

  5. linux7 kernel.sem,centos7.4内核调优,tcp单服务器万级并发

    在使用linux的centos7.4遇到的各种坑,其中一个项目采用四层架构,配置层,平台层,逻辑服务器管理层和集体逻辑服务器层的,一个整体的游戏项目,其中,作为整个项目负责人和架构打架着,项目运行一年 ...

  6. linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项

    Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...

  7. 机器学习与高维信息检索 - Note 7 - 核主成分分析(Kernel Principal Component Analysis,K-PCA)

    Note 7 - 核主成分分析(Kernel Principal Component Analysis) 核主成分分析 Note 7 - 核主成分分析(Kernel Principal Compone ...

  8. 机器学习与高维信息检索 - Note 6 - 核, 核方法与核函数(Kernels and the Kernel Trick)

    Note 6 核, 核方法与核函数 到目前为止,我们所讨论的机器学习算法的成功都依赖于对输入数据分布的假设.例如,PCA的效果越好,数据围绕线性子空间分布.或者在线性判别分析中,我们假设类的高斯分布, ...

  9. linux kernel list_head

    ​​​​​​​Play with kernel list_head, three exampleshttps://www.fatalerrors.org/a/play-with-kernel-list ...

  10. uboot引导kernel - 3 -uboot给内核传参详解

    uboot中执行theKernel函数后,kernel正式启动.如下函数,我们发现有3个参数. 1. 参数 0: 2. 参数machid; 如下code 中获取machid, gd是个全局变量. 2. ...

最新文章

  1. RPC是什么?为什么要学习RPC?
  2. 【部分原创】python实现视频内的face swap(换脸)
  3. 硬刚一周,3W字总结,一年的经验告诉你如何准备校招,拿大厂offer
  4. 数学之路(2)-数据分析-R基础(3)
  5. junit 单元测试报错java.lang.NoClassDefFoundError
  6. mysql 建立一棵树_如何存储一颗树到文件或者数据库
  7. 编写Android的LKM(Linux Kernel Module)
  8. (四)pscc学习笔记
  9. CPLEX——关键字
  10. Kaggle:Tabular Playground Series - May 2021
  11. 安装虚拟机报错 This kernel requires an X86-64 CPU,but only detected an i686 CPU
  12. Vite 入门 Vue Node
  13. 项目管理到底是一个什么样的职位,具体都做些什么事情?
  14. qt 访问共享文件夹_怎样用IP访问局域网共享文件
  15. 如何用windows xp自带的画图工具画箭头
  16. Android模拟登录教务系统(强智系统)
  17. windows 查看/清除DNS解析记录
  18. 01Java并发编程的艺术之并发编程的挑战
  19. cpa考试科目计算机,高顿教育:CPA考试计算器如何选择
  20. 二级菜单选中,一级菜单背景变换

热门文章

  1. 医学统计python之ROC比较:Delong test
  2. b51显微镜_1112-揭开微观世界的奥秘--显微镜发明的科学历程
  3. 已解决:有道云笔记web端和PC端频繁崩溃的解决方法
  4. e3 v3服务器芯片组,E3 V5专用主板特别在哪?华硕E3 PRO GAMING评测-太平洋电脑网
  5. numpy.angle角度制的取值
  6. 计算机硬件系统基本的工作原理是,硬件系统基本组成及工作原理
  7. 原生 android 平板,前沿体验 原生Android 4.0系统平板推荐
  8. windows Servers服务器系统时间总是自动更新为错误时间,修改了还是不对解决办法
  9. Anaconda 的Jupyter Notebook更换默认浏览器
  10. 计算机组成原理之输入输出设备