1.. SPDX-License-Identifier: GPL-2.0 2.. include:: ../../../disclaimer-zh_CN.rst 3 4:Original: Documentation/admin-guide/mm/damon/reclaim.rst 5 6:翻译: 7 8 司延腾 Yanteng Si <siyanteng@loongson.cn> 9 10:校译: 11 12=============== 13基于DAMON的回收 14=============== 15 16基于DAMON的回收(DAMON_RECLAIM)是一个静态的内核模块,旨在用于轻度内存压力下的主动和轻 17量级的回收。它的目的不是取代基于LRU列表的页面回收,而是有选择地用于不同程度的内存压力和要 18求。 19 20哪些地方需要主动回收? 21====================== 22 23在一般的内存超量使用(over-committed systems,虚拟化相关术语)的系统上,主动回收冷页 24有助于节省内存和减少延迟高峰,这些延迟是由直接回收进程或kswapd的CPU消耗引起的,同时只产 25生最小的性能下降 [1]_ [2]_ 。 26 27基于空闲页报告 [3]_ 的内存过度承诺的虚拟化系统就是很好的例子。在这样的系统中,客户机 28向主机报告他们的空闲内存,而主机则将报告的内存重新分配给其他客户。因此,系统的内存得到了充 29分的利用。然而,客户可能不那么节省内存,主要是因为一些内核子系统和用户空间应用程序被设计为 30使用尽可能多的内存。然后,客户机可能只向主机报告少量的内存是空闲的,导致系统的内存利用率下降。 31在客户中运行主动回收可以缓解这个问题。 32 33它是如何工作的? 34================ 35 36DAMON_RECLAIM找到在特定时间内没有被访问的内存区域并分页。为了避免它在分页操作中消耗过多 37的CPU,可以配置一个速度限制。在这个速度限制下,它首先分页出那些没有被访问过的内存区域。系 38统管理员还可以配置在什么情况下这个方案应该自动激活和停用三个内存压力水位。 39 40接口: 模块参数 41============== 42 43要使用这个功能,你首先要确保你的系统运行在一个以 ``CONFIG_DAMON_RECLAIM=y`` 构建的内 44核上。 45 46为了让系统管理员启用或禁用它,并为给定的系统进行调整,DAMON_RECLAIM利用了模块参数。也就 47是说,你可以把 ``damon_reclaim.<parameter>=<value>`` 放在内核启动命令行上,或者把 48适当的值写入 ``/sys/module/damon_reclaim/parameters/<parameter>`` 文件。 49 50下面是每个参数的描述。 51 52enabled 53------- 54 55启用或禁用DAMON_RECLAIM。 56 57你可以通过把这个参数的值设置为 ``Y`` 来启用DAMON_RCLAIM,把它设置为 ``N`` 可以禁用 58DAMON_RECLAIM。注意,由于基于水位的激活条件,DAMON_RECLAIM不能进行真正的监测和回收。 59这一点请参考下面关于水位参数的描述。 60 61min_age 62------- 63 64识别冷内存区域的时间阈值,单位是微秒。 65 66如果一个内存区域在这个时间或更长的时间内没有被访问,DAMON_RECLAIM会将该区域识别为冷的, 67并回收它。 68 69默认为120秒。 70 71quota_ms 72-------- 73 74回收的时间限制,以毫秒为单位。 75 76DAMON_RECLAIM 试图在一个时间窗口(quota_reset_interval_ms)内只使用到这个时间,以 77尝试回收冷页。这可以用来限制DAMON_RECLAIM的CPU消耗。如果该值为零,则该限制被禁用。 78 79默认为10ms。 80 81quota_sz 82-------- 83 84回收的内存大小限制,单位为字节。 85 86DAMON_RECLAIM 收取在一个时间窗口(quota_reset_interval_ms)内试图回收的内存量,并 87使其不超过这个限制。这可以用来限制CPU和IO的消耗。如果该值为零,则限制被禁用。 88 89默认情况下是128 MiB。 90 91quota_reset_interval_ms 92----------------------- 93 94时间/大小配额收取重置间隔,单位为毫秒。 95 96时间(quota_ms)和大小(quota_sz)的配额的目标重置间隔。也就是说,DAMON_RECLAIM在 97尝试回收‘不’超过quota_ms毫秒或quota_sz字节的内存。 98 99默认为1秒。 100 101wmarks_interval 102--------------- 103 104当DAMON_RECLAIM被启用但由于其水位规则而不活跃时,在检查水位之前的最小等待时间。 105 106wmarks_high 107----------- 108 109高水位的可用内存率(每千字节)。 110 111如果系统的可用内存(以每千字节为单位)高于这个数值,DAMON_RECLAIM就会变得不活跃,所以 112它什么也不做,只是定期检查水位。 113 114wmarks_mid 115---------- 116 117中间水位的可用内存率(每千字节)。 118 119如果系统的空闲内存(以每千字节为单位)在这个和低水位线之间,DAMON_RECLAIM就会被激活, 120因此开始监测和回收。 121 122wmarks_low 123---------- 124 125低水位的可用内存率(每千字节)。 126 127如果系统的空闲内存(以每千字节为单位)低于这个数值,DAMON_RECLAIM就会变得不活跃,所以 128它除了定期检查水位外什么都不做。在这种情况下,系统会退回到基于LRU列表的页面粒度回收逻辑。 129 130sample_interval 131--------------- 132 133监测的采样间隔,单位是微秒。 134 135DAMON用于监测冷内存的采样间隔。更多细节请参考DAMON文档 (:doc:`usage`) 。 136 137aggr_interval 138------------- 139 140监测的聚集间隔,单位是微秒。 141 142DAMON对冷内存监测的聚集间隔。更多细节请参考DAMON文档 (:doc:`usage`)。 143 144min_nr_regions 145-------------- 146 147监测区域的最小数量。 148 149DAMON用于冷内存监测的最小监测区域数。这可以用来设置监测质量的下限。但是,设 150置的太高可能会导致监测开销的增加。更多细节请参考DAMON文档 (:doc:`usage`) 。 151 152max_nr_regions 153-------------- 154 155监测区域的最大数量。 156 157DAMON用于冷内存监测的最大监测区域数。这可以用来设置监测开销的上限值。但是, 158设置得太低可能会导致监测质量不好。更多细节请参考DAMON文档 (:doc:`usage`) 。 159 160monitor_region_start 161-------------------- 162 163目标内存区域的物理地址起点。 164 165DAMON_RECLAIM将对其进行工作的内存区域的起始物理地址。也就是说,DAMON_RECLAIM 166将在这个区域中找到冷的内存区域并进行回收。默认情况下,该区域使用最大系统内存区。 167 168monitor_region_end 169------------------ 170 171目标内存区域的结束物理地址。 172 173DAMON_RECLAIM将对其进行工作的内存区域的末端物理地址。也就是说,DAMON_RECLAIM将 174在这个区域内找到冷的内存区域并进行回收。默认情况下,该区域使用最大系统内存区。 175 176kdamond_pid 177----------- 178 179DAMON线程的PID。 180 181如果DAMON_RECLAIM被启用,这将成为工作线程的PID。否则,为-1。 182 183nr_reclaim_tried_regions 184------------------------ 185 186试图通过DAMON_RECLAIM回收的内存区域的数量。 187 188bytes_reclaim_tried_regions 189--------------------------- 190 191试图通过DAMON_RECLAIM回收的内存区域的总字节数。 192 193nr_reclaimed_regions 194-------------------- 195 196通过DAMON_RECLAIM成功回收的内存区域的数量。 197 198bytes_reclaimed_regions 199----------------------- 200 201通过DAMON_RECLAIM成功回收的内存区域的总字节数。 202 203nr_quota_exceeds 204---------------- 205 206超过时间/空间配额限制的次数。 207 208例子 209==== 210 211下面的运行示例命令使DAMON_RECLAIM找到30秒或更长时间没有访问的内存区域并“回收”? 212为了避免DAMON_RECLAIM在分页操作中消耗过多的CPU时间,回收被限制在每秒1GiB以内。 213它还要求DAMON_RECLAIM在系统的可用内存率超过50%时不做任何事情,但如果它低于40%时 214就开始真正的工作。如果DAMON_RECLAIM没有取得进展,因此空闲内存率低于20%,它会要求 215DAMON_RECLAIM再次什么都不做,这样我们就可以退回到基于LRU列表的页面粒度回收了:: 216 217 # cd /sys/module/damon_reclaim/parameters 218 # echo 30000000 > min_age 219 # echo $((1 * 1024 * 1024 * 1024)) > quota_sz 220 # echo 1000 > quota_reset_interval_ms 221 # echo 500 > wmarks_high 222 # echo 400 > wmarks_mid 223 # echo 200 > wmarks_low 224 # echo Y > enabled 225 226.. [1] https://research.google/pubs/pub48551/ 227.. [2] https://lwn.net/Articles/787611/ 228.. [3] https://www.kernel.org/doc/html/latest/mm/free_page_reporting.html 229