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