Back to home page

OSCL-LXR

 
 

    


0001 .. SPDX-License-Identifier: GPL-2.0
0002 .. include:: ../../../disclaimer-zh_CN.rst
0003 
0004 :Original: Documentation/admin-guide/mm/damon/reclaim.rst
0005 
0006 :翻译:
0007 
0008  司延腾 Yanteng Si <siyanteng@loongson.cn>
0009 
0010 :校译:
0011 
0012 ===============
0013 基于DAMON的回收
0014 ===============
0015 
0016 基于DAMON的回收(DAMON_RECLAIM)是一个静态的内核模块,旨在用于轻度内存压力下的主动和轻
0017 量级的回收。它的目的不是取代基于LRU列表的页面回收,而是有选择地用于不同程度的内存压力和要
0018 求。
0019 
0020 哪些地方需要主动回收?
0021 ======================
0022 
0023 在一般的内存超量使用(over-committed systems,虚拟化相关术语)的系统上,主动回收冷页
0024 有助于节省内存和减少延迟高峰,这些延迟是由直接回收进程或kswapd的CPU消耗引起的,同时只产
0025 生最小的性能下降 [1]_ [2]_ 。
0026 
0027 基于空闲页报告 [3]_ 的内存过度承诺的虚拟化系统就是很好的例子。在这样的系统中,客户机
0028 向主机报告他们的空闲内存,而主机则将报告的内存重新分配给其他客户。因此,系统的内存得到了充
0029 分的利用。然而,客户可能不那么节省内存,主要是因为一些内核子系统和用户空间应用程序被设计为
0030 使用尽可能多的内存。然后,客户机可能只向主机报告少量的内存是空闲的,导致系统的内存利用率下降。
0031 在客户中运行主动回收可以缓解这个问题。
0032 
0033 它是如何工作的?
0034 ================
0035 
0036 DAMON_RECLAIM找到在特定时间内没有被访问的内存区域并分页。为了避免它在分页操作中消耗过多
0037 的CPU,可以配置一个速度限制。在这个速度限制下,它首先分页出那些没有被访问过的内存区域。系
0038 统管理员还可以配置在什么情况下这个方案应该自动激活和停用三个内存压力水位。
0039 
0040 接口: 模块参数
0041 ==============
0042 
0043 要使用这个功能,你首先要确保你的系统运行在一个以 ``CONFIG_DAMON_RECLAIM=y`` 构建的内
0044 核上。
0045 
0046 为了让系统管理员启用或禁用它,并为给定的系统进行调整,DAMON_RECLAIM利用了模块参数。也就
0047 是说,你可以把 ``damon_reclaim.<parameter>=<value>`` 放在内核启动命令行上,或者把
0048 适当的值写入 ``/sys/modules/damon_reclaim/parameters/<parameter>`` 文件。
0049 
0050 注意,除 ``启用`` 外的参数值只在DAMON_RECLAIM启动时应用。因此,如果你想在运行时应用新
0051 的参数值,而DAMON_RECLAIM已经被启用,你应该通过 ``启用`` 的参数文件禁用和重新启用它。
0052 在重新启用之前,应将新的参数值写入适当的参数值中。
0053 
0054 下面是每个参数的描述。
0055 
0056 enabled
0057 -------
0058 
0059 启用或禁用DAMON_RECLAIM。
0060 
0061 你可以通过把这个参数的值设置为 ``Y`` 来启用DAMON_RCLAIM,把它设置为 ``N`` 可以禁用
0062 DAMON_RECLAIM。注意,由于基于水位的激活条件,DAMON_RECLAIM不能进行真正的监测和回收。
0063 这一点请参考下面关于水位参数的描述。
0064 
0065 min_age
0066 -------
0067 
0068 识别冷内存区域的时间阈值,单位是微秒。
0069 
0070 如果一个内存区域在这个时间或更长的时间内没有被访问,DAMON_RECLAIM会将该区域识别为冷的,
0071 并回收它。
0072 
0073 默认为120秒。
0074 
0075 quota_ms
0076 --------
0077 
0078 回收的时间限制,以毫秒为单位。
0079 
0080 DAMON_RECLAIM 试图在一个时间窗口(quota_reset_interval_ms)内只使用到这个时间,以
0081 尝试回收冷页。这可以用来限制DAMON_RECLAIM的CPU消耗。如果该值为零,则该限制被禁用。
0082 
0083 默认为10ms。
0084 
0085 quota_sz
0086 --------
0087 
0088 回收的内存大小限制,单位为字节。
0089 
0090 DAMON_RECLAIM 收取在一个时间窗口(quota_reset_interval_ms)内试图回收的内存量,并
0091 使其不超过这个限制。这可以用来限制CPU和IO的消耗。如果该值为零,则限制被禁用。
0092 
0093 默认情况下是128 MiB。
0094 
0095 quota_reset_interval_ms
0096 -----------------------
0097 
0098 时间/大小配额收取重置间隔,单位为毫秒。
0099 
0100 时间(quota_ms)和大小(quota_sz)的配额的目标重置间隔。也就是说,DAMON_RECLAIM在
0101 尝试回收‘不’超过quota_ms毫秒或quota_sz字节的内存。
0102 
0103 默认为1秒。
0104 
0105 wmarks_interval
0106 ---------------
0107 
0108 当DAMON_RECLAIM被启用但由于其水位规则而不活跃时,在检查水位之前的最小等待时间。
0109 
0110 wmarks_high
0111 -----------
0112 
0113 高水位的可用内存率(每千字节)。
0114 
0115 如果系统的可用内存(以每千字节为单位)高于这个数值,DAMON_RECLAIM就会变得不活跃,所以
0116 它什么也不做,只是定期检查水位。
0117 
0118 wmarks_mid
0119 ----------
0120 
0121 中间水位的可用内存率(每千字节)。
0122 
0123 如果系统的空闲内存(以每千字节为单位)在这个和低水位线之间,DAMON_RECLAIM就会被激活,
0124 因此开始监测和回收。
0125 
0126 wmarks_low
0127 ----------
0128 
0129 低水位的可用内存率(每千字节)。
0130 
0131 如果系统的空闲内存(以每千字节为单位)低于这个数值,DAMON_RECLAIM就会变得不活跃,所以
0132 它除了定期检查水位外什么都不做。在这种情况下,系统会退回到基于LRU列表的页面粒度回收逻辑。
0133 
0134 sample_interval
0135 ---------------
0136 
0137 监测的采样间隔,单位是微秒。
0138 
0139 DAMON用于监测冷内存的采样间隔。更多细节请参考DAMON文档 (:doc:`usage`) 。
0140 
0141 aggr_interval
0142 -------------
0143 
0144 监测的聚集间隔,单位是微秒。
0145 
0146 DAMON对冷内存监测的聚集间隔。更多细节请参考DAMON文档 (:doc:`usage`)。
0147 
0148 min_nr_regions
0149 --------------
0150 
0151 监测区域的最小数量。
0152 
0153 DAMON用于冷内存监测的最小监测区域数。这可以用来设置监测质量的下限。但是,设
0154 置的太高可能会导致监测开销的增加。更多细节请参考DAMON文档 (:doc:`usage`) 。
0155 
0156 max_nr_regions
0157 --------------
0158 
0159 监测区域的最大数量。
0160 
0161 DAMON用于冷内存监测的最大监测区域数。这可以用来设置监测开销的上限值。但是,
0162 设置得太低可能会导致监测质量不好。更多细节请参考DAMON文档 (:doc:`usage`) 。
0163 
0164 monitor_region_start
0165 --------------------
0166 
0167 目标内存区域的物理地址起点。
0168 
0169 DAMON_RECLAIM将对其进行工作的内存区域的起始物理地址。也就是说,DAMON_RECLAIM
0170 将在这个区域中找到冷的内存区域并进行回收。默认情况下,该区域使用最大系统内存区。
0171 
0172 monitor_region_end
0173 ------------------
0174 
0175 目标内存区域的结束物理地址。
0176 
0177 DAMON_RECLAIM将对其进行工作的内存区域的末端物理地址。也就是说,DAMON_RECLAIM将
0178 在这个区域内找到冷的内存区域并进行回收。默认情况下,该区域使用最大系统内存区。
0179 
0180 kdamond_pid
0181 -----------
0182 
0183 DAMON线程的PID。
0184 
0185 如果DAMON_RECLAIM被启用,这将成为工作线程的PID。否则,为-1。
0186 
0187 nr_reclaim_tried_regions
0188 ------------------------
0189 
0190 试图通过DAMON_RECLAIM回收的内存区域的数量。
0191 
0192 bytes_reclaim_tried_regions
0193 ---------------------------
0194 
0195 试图通过DAMON_RECLAIM回收的内存区域的总字节数。
0196 
0197 nr_reclaimed_regions
0198 --------------------
0199 
0200 通过DAMON_RECLAIM成功回收的内存区域的数量。
0201 
0202 bytes_reclaimed_regions
0203 -----------------------
0204 
0205 通过DAMON_RECLAIM成功回收的内存区域的总字节数。
0206 
0207 nr_quota_exceeds
0208 ----------------
0209 
0210 超过时间/空间配额限制的次数。
0211 
0212 例子
0213 ====
0214 
0215 下面的运行示例命令使DAMON_RECLAIM找到30秒或更长时间没有访问的内存区域并“回收”?
0216 为了避免DAMON_RECLAIM在分页操作中消耗过多的CPU时间,回收被限制在每秒1GiB以内。
0217 它还要求DAMON_RECLAIM在系统的可用内存率超过50%时不做任何事情,但如果它低于40%时
0218 就开始真正的工作。如果DAMON_RECLAIM没有取得进展,因此空闲内存率低于20%,它会要求
0219 DAMON_RECLAIM再次什么都不做,这样我们就可以退回到基于LRU列表的页面粒度回收了::
0220 
0221     # cd /sys/modules/damon_reclaim/parameters
0222     # echo 30000000 > min_age
0223     # echo $((1 * 1024 * 1024 * 1024)) > quota_sz
0224     # echo 1000 > quota_reset_interval_ms
0225     # echo 500 > wmarks_high
0226     # echo 400 > wmarks_mid
0227     # echo 200 > wmarks_low
0228     # echo Y > enabled
0229 
0230 .. [1] https://research.google/pubs/pub48551/
0231 .. [2] https://lwn.net/Articles/787611/
0232 .. [3] https://www.kernel.org/doc/html/latest/mm/free_page_reporting.html