首页 > 其他分享 >基于DAMON的LRU链表排序 【ChatGPT】

基于DAMON的LRU链表排序 【ChatGPT】

时间:2023-12-13 10:33:24浏览次数:45  
标签:SORT 链表 区域 LRU 内存 DAMON 排序

DAMON-based LRU-lists Sorting

DAMON-based LRU-lists Sorting (DAMON_LRU_SORT) 是一个静态内核模块,旨在用于基于主动和轻量级数据访问模式的(去)优先级排序,以使LRU列表成为更可信赖的数据访问模式源。

需要主动LRU列表排序的情况

由于在大型系统上,页面粒度的访问检查开销可能相当大,LRU列表通常不会被主动排序,而是部分地和反应性地排序,用于特殊事件,包括特定用户请求、系统调用和内存压力。因此,LRU列表有时并不完全准备好用作某些情况下的可信赖的访问模式源,包括在突然的内存压力下选择回收目标页面。

由于DAMON可以识别最佳精度的访问模式,同时只引入用户指定范围的开销,主动运行DAMON_LRU_SORT可以帮助使LRU列表成为更可信赖的访问模式源,并且开销较低且可控。

工作原理

DAMON_LRU_SORT使用DAMON找到热页面(显示出高于用户指定阈值的访问率的内存区域的页面)和冷页面(显示出一段时间内没有访问的内存区域的页面),并对热页面进行优先排序,同时对冷页面进行降低优先级排序。为了避免它消耗太多CPU进行优先级排序,可以配置CPU时间使用限制。在限制下,首先优先排序和降低优先级排序更多的热和冷页面,分别。系统管理员还可以配置在什么情况下该方案应自动激活和停用,以及三个内存压力水印。

其热度/冷度阈值和CPU配额限制的默认参数是保守选择的。也就是说,在默认参数下,该模块可以广泛使用,而对于在内存压力下具有明确热/冷访问模式的系统,可以提供一定程度的好处,同时只消耗有限的CPU时间。

接口:模块参数

要使用此功能,首先确保系统正在运行构建有CONFIG_DAMON_LRU_SORT=y的内核。

为了让系统管理员启用或禁用它并为给定系统进行调整,DAMON_LRU_SORT使用模块参数。也就是说,您可以在内核引导命令行上放置damon_lru_sort.<parameter>=<value>,或者将适当的值写入/sys/module/damon_lru_sort/parameters/<parameter>文件。

以下是每个参数的描述。

  • enabled: 启用或禁用DAMON_LRU_SORT。可以通过将此参数的值设置为Y来启用DAMON_LRU_SORT。将其设置为N会禁用DAMON_LRU_SORT。请注意,由于基于水印的激活条件,DAMON_LRU_SORT可能无法进行实际监视和LRU列表排序。有关此的水印参数的描述,请参阅下面的描述。
  • commit_inputs: 使DAMON_LRU_SORT重新读取输入参数,除了enabled。默认情况下,DAMON_LRU_SORT正在运行时更新的输入参数不会被应用。一旦将此参数设置为Y,DAMON_LRU_SORT将重新读取参数的值,除了enabled。重新读取完成后,此参数将设置为N。如果在重新读取时发现无效参数,则DAMON_LRU_SORT将被禁用。
  • hot_thres_access_freq: 热内存区域识别的访问频率阈值,以千分之一为单位。如果内存区域的访问频率达到或超过此值,DAMON_LRU_SORT将识别该区域为热区域,并在LRU列表上标记为已访问,以便在内存压力下不会被回收。默认为50%。
  • cold_min_age: 冷内存区域识别的时间阈值,以微秒为单位。如果内存区域在此时间内没有访问,DAMON_LRU_SORT将识别该区域为冷区域,并在LRU列表上标记为未访问,以便在内存压力下首先被回收。默认为120秒。
  • quota_ms: 尝试在毫秒内对LRU列表进行排序的时间限制。DAMON_LRU_SORT尝试在时间窗口(quota_reset_interval_ms)内仅使用此时间。这可用于限制DAMON_LRU_SORT的CPU消耗。如果值为零,则禁用限制。默认为10毫秒。
  • quota_reset_interval_ms: 时间配额(quota_ms)的充值间隔,以毫秒为单位。时间配额(quota_ms)的充值间隔。也就是说,DAMON_LRU_SORT在quota_reset_interval_ms毫秒内或quota_sz字节内不会尝试对LRU列表进行排序。
  • wmarks_interval: 水印检查时间间隔,以微秒为单位。当DAMON_LRU_SORT启用但由于其水印规则而处于非活动状态时,在检查水印之前等待的最短时间。默认为5秒。
  • wmarks_high: 高水印的空闲内存率(千分之一)。如果系统的空闲内存以每千字节为单位高于此值,则DAMON_LRU_SORT将变为非活动状态,因此除了定期检查水印外不会执行任何操作。默认为200(20%)。
  • wmarks_mid: 中水印的空闲内存率(千分之一)。如果系统的空闲内存以每千字节为单位介于此值和低水印之间,则DAMON_LRU_SORT将变为活动状态,因此开始监视和LRU列表排序。默认为150(15%)。
  • wmarks_low: 低水印的空闲内存率(千分之一)。如果系统的空闲内存以每千字节为单位低于此值,则DAMON_LRU_SORT将变为非活动状态,因此除了定期检查水印外不会执行任何操作。默认为50(5%)。
  • sample_interval: 监视的采样间隔,以微秒为单位。DAMON的冷内存监视的采样间隔。有关更多详细信息,请参阅DAMON文档(详细用法)。默认为5毫秒。
  • aggr_interval: 监视的聚合间隔,以微秒为单位。DAMON的冷内存监视的聚合间隔。有关更多详细信息,请参阅DAMON文档(详细用法)。默认为100毫秒。
  • min_nr_regions: 监视区域的最小数量。DAMON的冷内存监视的最小监视区域数。这可用于设置监视质量的下限。但是,设置得太高可能会导致增加的监视开销。有关更多详细信息,请参阅DAMON文档(详细用法)。默认为10。
  • max_nr_regions: 监视区域的最大数量。DAMON的冷内存监视的最大监视区域数。这可用于设置监视开销的上限。但是,设置得太低可能会导致监视质量不佳。有关更多详细信息,请参阅DAMON文档(详细用法)。默认为1000。
  • monitor_region_start: 目标内存区域的起始物理地址。DAMON_LRU_SORT将针对其进行工作的内存区域的起始物理地址。默认情况下,使用最大的系统RAM作为区域。
  • monitor_region_end: 目标内存区域的结束物理地址。DAMON_LRU_SORT将针对其进行工作的内存区域的结束物理地址。默认情况下,使用最大的系统RAM作为区域。
  • kdamond_pid: DAMON线程的PID。如果启用了DAMON_LRU_SORT,则这将成为工作线程的PID。否则为-1。
  • nr_lru_sort_tried_hot_regions: 尝试进行LRU排序的热内存区域的数量。
  • bytes_lru_sort_tried_hot_regions: 尝试进行LRU排序的热内存区域的总字节数。
  • nr_lru_sorted_hot_regions: 成功进行LRU排序的热内存区域的数量。
  • bytes_lru_sorted_hot_regions: 成功进行LRU排序的热内存区域的总字节数。
  • nr_hot_quota_exceeds: 热区域的时间配额限制超出的次数。
  • nr_lru_sort_tried_cold_regions: 尝试进行LRU排序的冷内存区域的数量。
  • bytes_lru_sort_tried_cold_regions: 尝试进行LRU排序的冷内存区域的总字节数。
  • nr_lru_sorted_cold_regions: 成功进行LRU排序的冷内存区域的数量。
  • bytes_lru_sorted_cold_regions: 成功进行LRU排序的冷内存区域的总字节数。
  • nr_cold_quota_exceeds: 冷区域的时间配额限制超出的次数。

示例

以下是运行时示例命令,使DAMON_LRU_SORT查找具有>=50%访问频率的内存区域,并在LRU优先级排序的同时,对120秒内未访问的内存区域进行LRU降低优先级排序。优先级排序和降低优先级排序受限于最多使用1%的CPU时间,以避免DAMON_LRU_SORT消耗过多CPU时间进行(去)优先级排序。如果系统的空闲内存率高于50%,则它还要求DAMON_LRU_SORT不执行任何操作,但如果它低于40%,则开始实际工作。如果DAMON_RECLAIM没有取得进展,因此空闲内存率低于20%,则它再次要求DAMON_LRU_SORT不执行任何操作,以便我们可以回退到基于LRU列表的页面粒度回收。

cd /sys/module/damon_lru_sort/parameters
echo 500 > hot_thres_access_freq
echo 120000000 > cold_min_age
echo 10 > quota_ms
echo 1000 > quota_reset_interval_ms
echo 500 > wmarks_high
echo 400 > wmarks_mid
echo 200 > wmarks_low
echo Y > enabled

标签:SORT,链表,区域,LRU,内存,DAMON,排序
From: https://www.cnblogs.com/pengdonglin137/p/17898497.html

相关文章

  • DAMON: Data Access MONitor 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/index.htmlhttps://www.kernel.org/doc/html/v6.6/mm/damon/index.htmladminguideDAMON(轻量级数据访问监控)DAMON是一种轻量级数据访问监控工具。使用DAMON,用户可以分析系统的内存访问模式并进行优化。入......
  • 使用 DAMON 入门指南 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/start.html使用DAMON入门指南本文档简要描述了如何使用DAMON,并演示了其默认用户空间工具。请注意,出于简洁起见,本文档仅描述了其部分功能。更多细节,请参考工具的使用文档。先决条件内核首先,您应确保系统正在......
  • [LeetCode] LeetCode92. 反转链表II
    题目描述思路:同LeetCode25.K个一组翻转链表因为涉及到可能链表的头节点会改变,所以设置dummy节点先走left-1步到达left的左边一个节点查看后面是否存在right-left+1个节点先翻转内部节点指向right-left次再翻转外部节点方法一:/***Definitionforsingly-lin......
  • [刷题技巧] 链表刷题技巧汇总
    链表的算法题中很常见的技巧:添加虚拟头结点,即dummy结点。当需要创造一条新链表的时候,可以使用虚拟头节点简化边界情况的处理。例如:LeetCode21.合并两个有序链表,让两条有序链表合并成一条新的有序链表,需要创造一条新的链表。例如,LeetCode86.分隔链表,把一条链表分解成两条链......
  • Multi-Gen LRU 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/multigen_lru.html多代LRU多代LRU是一种替代LRU实现,它优化页面回收并在内存压力下提高性能。页面回收决定了内核的缓存策略和内存过度分配的能力。它直接影响了kswapdCPU的使用率和RAM的效率。设计概述目标设计目标包括:良好的......
  • 如何判断链表是否存在环?
    大家好,今天我们来聊一聊如何判断链表是否存在环。如果你是一个链表的小白,听到“环”这个词可能会感到一头雾水。别担心,我会用通俗易懂的语言来解释这个问题,并带大家看一段代码演示。首先,我们要了解什么是链表。链表是一种数据结构,由一系列节点组成,每个节点都有一个值和一个指向下一......
  • DAMON: 数据访问监控 (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/index.htmlDAMON:数据访问监控DAMON允许进行轻量级的数据访问监控。使用DAMON,用户可以分析其系统的内存访问模式并进行优化。入门指南先决条件记录数据访问模式可视化记录的模式数据访问模式感知内存管理......
  • [LeetCode Hot 100] LeetCode24. 两两交换链表中的节点
    题目描述思路:创建dummy节点,令dummy.next=head。令cur表示当前到达的节点,初始时cur=dummy。每次需要交换cur后面的两个节点。如果cur的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得cur后面的两个节点node1和node2,通过更新节点的指针关系......
  • [LeetCode Hot 100] LeetCode148. 排序链表
    题目描述思路一:堆排序、小顶堆定义一个最小堆将链表的所有节点放入一个最小堆中直接用队列弹出的最小值依次覆盖掉原链表的值方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • [LeetCode Hot 100] LeetCode138. 随机链表的复制
    题目描述思路一:添加"小弟"根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面。原节点i的随机指针(如果有的话),指向的是原节点j,那么新节点i的随机指针,指向的是原节点j的next最后将两个链表分开,再返回新链表就可以思路二:使用哈希表首先创建一个哈希表......