1.. SPDX-License-Identifier: GPL-2.0 2.. include:: ../../../disclaimer-zh_CN.rst 3 4:Original: Documentation/admin-guide/mm/damon/lru_sort.rst 5 6:翻译: 7 8 臧雷刚 Leigang Zang <zangleigang@hisilicon.com> 9 10:校译: 11 12================== 13基于DAMON的LRU排序 14================== 15 16基于DAMON的LRU排序是一个静态的内核模块,旨在用于以主动的、轻量级的数据访问模型 17为基础的页面优先级处理的LRU链表上,以使得LRU上的数据访问模型更为可信。 18 19哪里需要主动的LRU排序 20===================== 21 22在一个大型系统中,以页为粒度的访问检测会有比较显著的开销,LRU通常不会主动去排序, 23而是对部分特殊事件进行部分的、响应式的排序,例如:特殊的用户请求,系统调用或者 24内存压力。这导致,在有些场景下,LRU不能够完美的作为一个可信的数据访问模型,比如 25在内存压力下对目标内存进行回收。 26 27因为DAMON能够尽可能准确的识别数据访问模型,同时只引起用户指定范围的开销,主动的 28执行DAMON_LRU_SORT让LRU变得更为可信是有益的,而且这只需要较少和可控的开销。 29 30这是如何工作的 31============== 32 33DAMON_LRU_SORT使用DAMON寻找热页(范围内的页面访问频率高于用户指定的阈值)和冷页 34(范围内的页面在超过用户指定的时间无访问),并提高热页和降低冷页在LRU中的优先级。 35为了避免在排序过程占用更多的CPU计算资源,可以设置一个CPU占用时间的约束值。在约 36束下,分别提升或者降低更多的热页和冷页。系统管理员也可以配置三个内存水位以控制 37在何种条件下自动激活或者停止这种机制。 38 39冷热阈值和CPU约束的默认值是比较保守的。这意味着,在默认参数下,模块可以广泛且无 40负作用的使用在常见环境中,同时在只消耗一小部分CPU时间的情况下,给有内存压力的系 41统提供一定水平的冷热识别。 42 43接口:模块参数 44============== 45 46使用此特性,你首先需要确认你的系统中运行的内核在编译时启用了 47``CONFIG_DAMON_LRU_SORT=y``. 48 49为了让系统管理员打开或者关闭并且调节指定的系统,DAMON_LRU_SORT设计了模块参数。 50这意味着,你可以添加 ``damon_lru_sort.<parameter>=<value>`` 到内核的启动命令行 51参数,或者在 ``/sys/modules/damon_lru_sort/parameters/<parameter>`` 写入正确的 52值。 53 54下边是每个参数的描述 55 56enabled 57------- 58 59打开或者关闭DAMON_LRU_SORT. 60 61你可以通过设置这个参数为 ``Y`` 来打开DAMON_LRU_SORT。设置为 ``N`` 关闭 62DAMON_LRU_SORT。注意,在基于水位的激活的情况下,DAMON_LRU_SORT有可能不会真正去 63监测或者做LRU排序。对这种情况,参考下方关于水位的描述。 64 65commit_inputs 66------------- 67 68让DAMON_LRU_SORT再次读取输入参数,除了 ``enabled`` 。 69 70在DAMON_LRU_SORT运行时,新的输入参数默认不会被应用。一旦这个参数被设置为 ``Y`` 71,DAMON_LRU_SORT会再次读取除了 ``enabled`` 之外的参数。读取完成后,这个参数会被 72设置为 ``N`` 。如果在读取时发现有无效参数,DAMON_LRU_SORT会被关闭。 73 74hot_thres_access_freq 75--------------------- 76 77热点内存区域的访问频率阈值,千分比。 78 79如果一个内存区域的访问频率大于等于这个值,DAMON_LRU_SORT把这个区域看作热区,并 80在LRU上把这个区域标记为已访问,因些在内存压力下这部分内存不会被回收。默认为50%。 81 82cold_min_age 83------------ 84 85用于识别冷内存区域的时间阈值,单位是微秒。 86 87如果一个内存区域在这个时间内未被访问过,DAMON_LRU_SORT把这个区域看作冷区,并在 88LRU上把这个区域标记为未访问,因此在内存压力下这些内存会首先被回收。默认值为120 89秒。 90 91quota_ms 92-------- 93 94尝试LRU链表排序的时间限制,单位是毫秒。 95 96DAMON_LRU_SORT在一个时间窗口内(quota_reset_interval_ms)内最多尝试这么长时间来 97对LRU进行排序。这个可以用来作为CPU计算资源的约束。如果值为0,则表示无限制。 98 99默认10毫秒。 100 101quota_reset_interval_ms 102----------------------- 103 104配额计时重置周期,毫秒。 105 106配额计时重置周期。即,在quota_reset_interval_ms毫秒内,DAMON_LRU_SORT对LRU进行 107排序不会超过quota_ms或者quota_sz。 108 109默认1秒。 110 111wmarks_interval 112--------------- 113 114水位的检查周期,单位是微秒。 115 116当DAMON_LRU_SORT使能但是由于水位而不活跃时检查水位前最小的等待时间。默认值5秒。 117 118wmarks_high 119----------- 120 121空闲内存高水位,千分比。 122 123如果空闲内存水位高于这个值,DAMON_LRU_SORT停止工作,不做任何事,除了周期性的检 124查水位。默认200(20%)。 125 126wmarks_mid 127---------- 128 129空闲内存中间水位,千分比。 130 131如果空闲内存水位在这个值与低水位之间,DAMON_LRU_SORT开始工作,开始检测并对LRU链 132表进行排序。默认150(15%)。 133 134wmarks_low 135---------- 136 137空闲内存低水位,千分比。 138 139如果空闲内存小于这个值,DAMON_LRU_SORT不再工作,不做任何事,除了周期性的检查水 140线。默认50(5%)。 141 142sample_interval 143--------------- 144 145监测的采样周期,微秒。 146 147DAMON对冷内存监测的采样周期。更多细节请参考DAMON文档 (:doc:`usage`) 。默认5 148毫秒。 149 150aggr_interval 151------------- 152 153监测的收集周期,微秒。 154 155DAMON对冷内存进行收集的时间周期。更多细节请参考DAMON文档 (:doc:`usage`) 。默认 156100毫秒。 157 158min_nr_regions 159-------------- 160 161最小监测区域数量。 162 163对冷内存区域监测的最小数量。这个值可以作为监测质量的下限。不过,这个值设置的过 164大会增加开销。更多细节请参考DAMON文档 (:doc:`usage`) 。默认值为10。 165 166max_nr_regions 167-------------- 168 169最大监测区域数量。 170 171对冷内存区域监测的最大数量。这个值可以作为监测质量的上限。然而,这个值设置的过 172低会导致监测结果变差。更多细节请参考DAMON文档 (:doc:`usage`) 。默认值为1000。 173 174monitor_region_start 175-------------------- 176 177目标内存区域的起始物理地址。 178 179DAMON_LRU_SORT要处理的目标内存区域的起始物理地址。默认,使用系统最大内存。 180 181monitor_region_end 182------------------ 183 184目标内存区域的结束物理地址。 185 186DAMON_LRU_SORT要处理的目标内存区域的结束物理地址。默认,使用系统最大内存。 187 188kdamond_pid 189----------- 190 191DAMON线程的PID。 192 193如果DAMON_LRU_SORT是使能的,这个表示任务线程的PID。其它情况为-1。 194 195nr_lru_sort_tried_hot_regions 196----------------------------- 197 198被尝试进行LRU排序的热内存区域的数量。 199 200bytes_lru_sort_tried_hot_regions 201-------------------------------- 202 203被尝试进行LRU排序的热内存区域的大小(字节)。 204 205nr_lru_sorted_hot_regions 206------------------------- 207 208成功进行LRU排序的热内存区域的数量。 209 210bytes_lru_sorted_hot_regions 211---------------------------- 212 213成功进行LRU排序的热内存区域的大小(字节)。 214 215nr_hot_quota_exceeds 216-------------------- 217 218热区域时间约束超过限制的次数。 219 220nr_lru_sort_tried_cold_regions 221------------------------------ 222 223被尝试进行LRU排序的冷内存区域的数量。 224 225bytes_lru_sort_tried_cold_regions 226--------------------------------- 227 228被尝试进行LRU排序的冷内存区域的大小(字节)。 229 230nr_lru_sorted_cold_regions 231-------------------------- 232 233成功进行LRU排序的冷内存区域的数量。 234 235bytes_lru_sorted_cold_regions 236----------------------------- 237 238成功进行LRU排序的冷内存区域的大小(字节)。 239 240nr_cold_quota_exceeds 241--------------------- 242 243冷区域时间约束超过限制的次数。 244 245Example 246======= 247 248如下是一个运行时的命令示例,使DAMON_LRU_SORT查找访问频率超过50%的区域并对其进行 249LRU的优先级的提升,同时降低那些超过120秒无人访问的内存区域的优先级。优先级的处 250理被限制在最多1%的CPU以避免DAMON_LRU_SORT消费过多CPU时间。在系统空闲内存超过50% 251时DAMON_LRU_SORT停止工作,并在低于40%时重新开始工作。如果DAMON_RECLAIM没有取得 252进展且空闲内存低于20%,再次让DAMON_LRU_SORT停止工作,以此回退到以LRU链表为基础 253以页面为单位的内存回收上。 :: 254 255 # cd /sys/modules/damon_lru_sort/parameters 256 # echo 500 > hot_thres_access_freq 257 # echo 120000000 > cold_min_age 258 # echo 10 > quota_ms 259 # echo 1000 > quota_reset_interval_ms 260 # echo 500 > wmarks_high 261 # echo 400 > wmarks_mid 262 # echo 200 > wmarks_low 263 # echo Y > enabled 264