~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/admin-guide/mm/damon/usage.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0
  2 .. include:: ../../../disclaimer-zh_CN.rst
  3 
  4 :Original: Documentation/admin-guide/mm/damon/usage.rst
  5 
  6 :翻译:
  7 
  8  司延腾 Yanteng Si <siyanteng@loongson.cn>
  9 
 10 :校译:
 11 
 12 ========
 13 详细用法
 14 ========
 15 
 16 DAMON 为不同的用户提供了下面这些接口。
 17 
 18 - *DAMON用户空间工具。*
 19   `这 <https://github.com/damonitor/damo>`_ 为有这特权的人, 如系统管理员,希望有一个刚好
 20   可以工作的人性化界面。
 21   使用它,用户可以以人性化的方式使用DAMON的主要功能。不过,它可能不会为特殊情况进行高度调整。
 22   它同时支持虚拟和物理地址空间的监测。更多细节,请参考它的 `使用文档
 23   <https://github.com/damonitor/damo/blob/next/USAGE.md>`_。
 24 - *sysfs接口。*
 25   :ref:`这 <sysfs_interface>` 是为那些希望更高级的使用DAMON的特权用户空间程序员准备的。
 26   使用它,用户可以通过读取和写入特殊的sysfs文件来使用DAMON的主要功能。因此,你可以编写和使
 27   用你个性化的DAMON sysfs包装程序,代替你读/写sysfs文件。  `DAMON用户空间工具
 28   <https://github.com/damonitor/damo>`_ 就是这种程序的一个例子  它同时支持虚拟和物理地址
 29   空间的监测。注意,这个界面只提供简单的监测结果 :ref:`统计 <damos_stats>`。对于详细的监测
 30   结果,DAMON提供了一个:ref:`跟踪点 <tracepoint>`。
 31 - *debugfs interface.*
 32   :ref:`这 <debugfs_interface>` 几乎与:ref:`sysfs interface <sysfs_interface>` 接
 33   口相同。这将在下一个LTS内核发布后被移除,所以用户应该转移到
 34   :ref:`sysfs interface <sysfs_interface>`。
 35 - *内核空间编程接口。*
 36   :doc:`这 </mm/damon/api>` 这是为内核空间程序员准备的。使用它,用户可以通过为你编写内
 37   核空间的DAMON应用程序,最灵活有效地利用DAMON的每一个功能。你甚至可以为各种地址空间扩展DAMON。
 38   详细情况请参考接口 :doc:`文件 </mm/damon/api>`。
 39 
 40 sysfs接口
 41 =========
 42 DAMON的sysfs接口是在定义 ``CONFIG_DAMON_SYSFS`` 时建立的。它在其sysfs目录下创建多
 43 个目录和文件, ``<sysfs>/kernel/mm/damon/`` 。你可以通过对该目录下的文件进行写入和
 44 读取来控制DAMON。
 45 
 46 对于一个简短的例子,用户可以监测一个给定工作负载的虚拟地址空间,如下所示::
 47 
 48     # cd /sys/kernel/mm/damon/admin/
 49     # echo 1 > kdamonds/nr_kdamonds && echo 1 > kdamonds/0/contexts/nr_contexts
 50     # echo vaddr > kdamonds/0/contexts/0/operations
 51     # echo 1 > kdamonds/0/contexts/0/targets/nr_targets
 52     # echo $(pidof <workload>) > kdamonds/0/contexts/0/targets/0/pid_target
 53     # echo on > kdamonds/0/state
 54 
 55 文件层次结构
 56 ------------
 57 
 58 DAMON sysfs接口的文件层次结构如下图所示。在下图中,父子关系用缩进表示,每个目录有
 59 ``/`` 后缀,每个目录中的文件用逗号(",")分开。 ::
 60 
 61     /sys/kernel/mm/damon/admin
 62     │ kdamonds/nr_kdamonds
 63     │ │ 0/state,pid
 64     │ │ │ contexts/nr_contexts
 65     │ │ │ │ 0/operations
 66     │ │ │ │ │ monitoring_attrs/
 67     │ │ │ │ │ │ intervals/sample_us,aggr_us,update_us
 68     │ │ │ │ │ │ nr_regions/min,max
 69     │ │ │ │ │ targets/nr_targets
 70     │ │ │ │ │ │ 0/pid_target
 71     │ │ │ │ │ │ │ regions/nr_regions
 72     │ │ │ │ │ │ │ │ 0/start,end
 73     │ │ │ │ │ │ │ │ ...
 74     │ │ │ │ │ │ ...
 75     │ │ │ │ │ schemes/nr_schemes
 76     │ │ │ │ │ │ 0/action
 77     │ │ │ │ │ │ │ access_pattern/
 78     │ │ │ │ │ │ │ │ sz/min,max
 79     │ │ │ │ │ │ │ │ nr_accesses/min,max
 80     │ │ │ │ │ │ │ │ age/min,max
 81     │ │ │ │ │ │ │ quotas/ms,bytes,reset_interval_ms
 82     │ │ │ │ │ │ │ │ weights/sz_permil,nr_accesses_permil,age_permil
 83     │ │ │ │ │ │ │ watermarks/metric,interval_us,high,mid,low
 84     │ │ │ │ │ │ │ stats/nr_tried,sz_tried,nr_applied,sz_applied,qt_exceeds
 85     │ │ │ │ │ │ │ tried_regions/
 86     │ │ │ │ │ │ │ │ 0/start,end,nr_accesses,age
 87     │ │ │ │ │ │ │ │ ...
 88     │ │ │ │ │ │ ...
 89     │ │ │ │ ...
 90     │ │ ...
 91 
 9293 --
 94 
 95 DAMON sysfs接口的根是 ``<sysfs>/kernel/mm/damon/`` ,它有一个名为 ``admin`` 的
 96 目录。该目录包含特权用户空间程序控制DAMON的文件。拥有根权限的用户空间工具或deamons可以
 97 使用这个目录。
 98 
 99 kdamonds/
100 ---------
101 
102 与监测相关的信息包括请求规格和结果被称为DAMON上下文。DAMON用一个叫做kdamond的内核线程
103 执行每个上下文,多个kdamonds可以并行运行。
104 
105 在 ``admin`` 目录下,有一个目录,即``kdamonds``,它有控制kdamonds的文件存在。在开始
106 时,这个目录只有一个文件,``nr_kdamonds``。向该文件写入一个数字(``N``),就会创建名为
107 ``0`` 到 ``N-1`` 的子目录数量。每个目录代表每个kdamond。
108 
109 kdamonds/<N>/
110 -------------
111 
112 在每个kdamond目录中,存在两个文件(``state`` 和 ``pid`` )和一个目录( ``contexts`` )。
113 
114 读取 ``state`` 时,如果kdamond当前正在运行,则返回 ``on`` ,如果没有运行则返回 ``off`` 。
115 写入 ``on`` 或 ``off`` 使kdamond处于状态。向 ``state`` 文件写 ``update_schemes_stats`` ,
116 更新kdamond的每个基于DAMON的操作方案的统计文件的内容。关于统计信息的细节,请参考
117 :ref:`stats section <sysfs_schemes_stats>`. 将 ``update_schemes_tried_regions`` 写到
118 ``state`` 文件,为kdamond的每个基于DAMON的操作方案,更新基于DAMON的操作方案动作的尝试区域目录。
119 将`clear_schemes_tried_regions`写入`state`文件,清除kdamond的每个基于DAMON的操作方案的动作
120 尝试区域目录。 关于基于DAMON的操作方案动作尝试区域目录的细节,请参考:ref:tried_regions 部分
121 <sysfs_schemes_tried_regions>`。
122 
123 如果状态为 ``on``,读取 ``pid`` 显示kdamond线程的pid。
124 
125 ``contexts`` 目录包含控制这个kdamond要执行的监测上下文的文件。
126 
127 kdamonds/<N>/contexts/
128 ----------------------
129 
130 在开始时,这个目录只有一个文件,即 ``nr_contexts`` 。向该文件写入一个数字( ``N`` ),就会创
131 建名为``0`` 到 ``N-1`` 的子目录数量。每个目录代表每个监测背景。目前,每个kdamond只支持
132 一个上下文,所以只有 ``0`` 或 ``1`` 可以被写入文件。
133 
134 contexts/<N>/
135 -------------
136 
137 在每个上下文目录中,存在一个文件(``operations``)和三个目录(``monitoring_attrs``,
138 ``targets``, 和 ``schemes``)。
139 
140 DAMON支持多种类型的监测操作,包括对虚拟地址空间和物理地址空间的监测。你可以通过向文件
141 中写入以下关键词之一,并从文件中读取,来设置和获取DAMON将为上下文使用何种类型的监测操作。
142 
143  - vaddr: 监测特定进程的虚拟地址空间
144  - paddr: 监视系统的物理地址空间
145 
146 contexts/<N>/monitoring_attrs/
147 ------------------------------
148 
149 用于指定监测属性的文件,包括所需的监测质量和效率,都在 ``monitoring_attrs`` 目录中。
150 具体来说,这个目录下有两个目录,即 ``intervals`` 和 ``nr_regions`` 。
151 
152 在 ``intervals`` 目录下,存在DAMON的采样间隔(``sample_us``)、聚集间隔(``aggr_us``)
153 和更新间隔(``update_us``)三个文件。你可以通过写入和读出这些文件来设置和获取微秒级的值。
154 
155 在 ``nr_regions`` 目录下,有两个文件分别用于DAMON监测区域的下限和上限(``min`` 和 ``max`` ),
156 这两个文件控制着监测的开销。你可以通过向这些文件的写入和读出来设置和获取这些值。
157 
158 关于间隔和监测区域范围的更多细节,请参考设计文件 (:doc:`/mm/damon/design`)。
159 
160 contexts/<N>/targets/
161 ---------------------
162 
163 在开始时,这个目录只有一个文件 ``nr_targets`` 。向该文件写入一个数字(``N``),就可以创建
164 名为 ``0`` 到 ``N-1`` 的子目录的数量。每个目录代表每个监测目标。
165 
166 targets/<N>/
167 ------------
168 
169 在每个目标目录中,存在一个文件(``pid_target``)和一个目录(``regions``)。
170 
171 如果你把 ``vaddr`` 写到 ``contexts/<N>/operations`` 中,每个目标应该是一个进程。你
172 可以通过将进程的pid写到 ``pid_target`` 文件中来指定DAMON的进程。
173 
174 targets/<N>/regions
175 -------------------
176 
177 当使用 ``vaddr`` 监测操作集时( ``vaddr`` 被写入 ``contexts/<N>/operations`` 文
178 件),DAMON自动设置和更新监测目标区域,这样就可以覆盖目标进程的整个内存映射。然而,用户可
179 能希望将初始监测区域设置为特定的地址范围。
180 
181 相反,当使用 ``paddr`` 监测操作集时,DAMON不会自动设置和更新监测目标区域( ``paddr``
182 被写入 ``contexts/<N>/operations`` 中)。因此,在这种情况下,用户应该自己设置监测目标
183 区域。
184 
185 在这种情况下,用户可以按照自己的意愿明确设置初始监测目标区域,将适当的值写入该目录下的文件。
186 
187 开始时,这个目录只有一个文件, ``nr_regions`` 。向该文件写入一个数字(``N``),就可以创
188 建名为 ``0`` 到  ``N-1`` 的子目录。每个目录代表每个初始监测目标区域。
189 
190 regions/<N>/
191 ------------
192 
193 在每个区域目录中,你会发现两个文件( ``start``  和  ``end`` )。你可以通过向文件写入
194 和从文件中读出,分别设置和获得初始监测目标区域的起始和结束地址。
195 
196 每个区域不应该与其他区域重叠。 目录“N”的“结束”应等于或小于目录“N+1”的“开始”。
197 
198 contexts/<N>/schemes/
199 ---------------------
200 
201 对于一版的基于DAMON的数据访问感知的内存管理优化,用户通常希望系统对特定访问模式的内存区
202 域应用内存管理操作。DAMON从用户那里接收这种形式化的操作方案,并将这些方案应用于目标内存
203 区域。用户可以通过读取和写入这个目录下的文件来获得和设置这些方案。
204 
205 在开始时,这个目录只有一个文件,``nr_schemes``。向该文件写入一个数字(``N``),就可以
206 创建名为``0``到``N-1``的子目录的数量。每个目录代表每个基于DAMON的操作方案。
207 
208 schemes/<N>/
209 ------------
210 
211 在每个方案目录中,存在五个目录(``access_pattern``、``quotas``、``watermarks``、
212 ``stats`` 和 ``tried_regions``)和一个文件(``action``)。
213 
214 ``action`` 文件用于设置和获取你想应用于具有特定访问模式的内存区域的动作。可以写入文件
215 和从文件中读取的关键词及其含义如下。
216 
217  - ``willneed``: 对有 ``MADV_WILLNEED`` 的区域调用 ``madvise()`` 。
218  - ``cold``: 对具有 ``MADV_COLD`` 的区域调用 ``madvise()`` 。
219  - ``pageout``: 为具有 ``MADV_PAGEOUT`` 的区域调用 ``madvise()`` 。
220  - ``hugepage``: 为带有 ``MADV_HUGEPAGE`` 的区域调用 ``madvise()`` 。
221  - ``nohugepage``: 为带有 ``MADV_NOHUGEPAGE`` 的区域调用 ``madvise()``。
222  - ``lru_prio``: 在其LRU列表上对区域进行优先排序。
223  - ``lru_deprio``: 对区域的LRU列表进行降低优先处理。
224  - ``stat``: 什么都不做,只计算统计数据
225 
226 schemes/<N>/access_pattern/
227 ---------------------------
228 
229 每个基于DAMON的操作方案的目标访问模式由三个范围构成,包括以字节为单位的区域大小、每个
230 聚合区间的监测访问次数和区域年龄的聚合区间数。
231 
232 在 ``access_pattern`` 目录下,存在三个目录( ``sz``, ``nr_accesses``, 和 ``age`` ),
233 每个目录有两个文件(``min`` 和 ``max`` )。你可以通过向  ``sz``, ``nr_accesses``, 和
234 ``age``  目录下的 ``min`` 和 ``max`` 文件分别写入和读取来设置和获取给定方案的访问模式。
235 
236 schemes/<N>/quotas/
237 -------------------
238 
239 每个 ``动作`` 的最佳 ``目标访问模式`` 取决于工作负载,所以不容易找到。更糟糕的是,将某些动作
240 的方案设置得过于激进会造成严重的开销。为了避免这种开销,用户可以为每个方案限制时间和大小配额。
241 具体来说,用户可以要求DAMON尽量只使用特定的时间(``时间配额``)来应用动作,并且在给定的时间间
242 隔(``重置间隔``)内,只对具有目标访问模式的内存区域应用动作,而不使用特定数量(``大小配额``)。
243 
244 当预计超过配额限制时,DAMON会根据 ``目标访问模式`` 的大小、访问频率和年龄,对找到的内存区域
245 进行优先排序。为了进行个性化的优先排序,用户可以为这三个属性设置权重。
246 
247 在 ``quotas`` 目录下,存在三个文件(``ms``, ``bytes``, ``reset_interval_ms``)和一个
248 目录(``weights``),其中有三个文件(``sz_permil``, ``nr_accesses_permil``, 和
249 ``age_permil``)。
250 
251 你可以设置以毫秒为单位的 ``时间配额`` ,以字节为单位的 ``大小配额`` ,以及以毫秒为单位的 ``重
252 置间隔`` ,分别向这三个文件写入数值。你还可以通过向 ``weights`` 目录下的三个文件写入数值来设
253 置大小、访问频率和年龄的优先权,单位为千分之一。
254 
255 schemes/<N>/watermarks/
256 -----------------------
257 
258 为了便于根据系统状态激活和停用每个方案,DAMON提供了一个称为水位的功能。该功能接收五个值,称为
259 ``度量`` 、``间隔`` 、``高`` 、``中`` 、``低`` 。``度量值`` 是指可以测量的系统度量值,如
260 自由内存比率。如果系统的度量值 ``高`` 于memoent的高值或 ``低`` 于低值,则该方案被停用。如果
261 该值低于 ``中`` ,则该方案被激活。
262 
263 在水位目录下,存在五个文件(``metric``, ``interval_us``,``high``, ``mid``, and ``low``)
264 用于设置每个值。你可以通过向这些文件的写入来分别设置和获取这五个值。
265 
266 可以写入 ``metric`` 文件的关键词和含义如下。
267 
268  - none: 忽略水位
269  - free_mem_rate: 系统的自由内存率(千分比)。
270 
271 ``interval`` 应以微秒为单位写入。
272 
273 schemes/<N>/stats/
274 ------------------
275 
276 DAMON统计每个方案被尝试应用的区域的总数量和字节数,每个方案被成功应用的区域的两个数字,以及
277 超过配额限制的总数量。这些统计数据可用于在线分析或调整方案。
278 
279 可以通过读取 ``stats`` 目录下的文件(``nr_tried``, ``sz_tried``, ``nr_applied``,
280 ``sz_applied``, 和 ``qt_exceeds``))分别检索这些统计数据。这些文件不是实时更新的,所以
281 你应该要求DAMON sysfs接口通过在相关的 ``kdamonds/<N>/state`` 文件中写入一个特殊的关键字
282 ``update_schemes_stats`` 来更新统计信息的文件内容。
283 
284 schemes/<N>/tried_regions/
285 --------------------------
286 
287 当一个特殊的关键字 ``update_schemes_tried_regions`` 被写入相关的 ``kdamonds/<N>/state``
288 文件时,DAMON会在这个目录下创建从 ``0`` 开始命名的整数目录。每个目录包含的文件暴露了关于每个
289 内存区域的详细信息,在下一个 :ref:`聚集区间 <sysfs_monitoring_attrs>`,相应的方案的 ``动作``
290 已经尝试在这个目录下应用。这些信息包括地址范围、``nr_accesses`` 以及区域的 ``年龄`` 。
291 
292 当另一个特殊的关键字 ``clear_schemes_tried_regions`` 被写入相关的 ``kdamonds/<N>/state``
293 文件时,这些目录将被删除。
294 
295 tried_regions/<N>/
296 ------------------
297 
298 在每个区域目录中,你会发现四个文件(``start``, ``end``, ``nr_accesses``, and ``age``)。
299 读取这些文件将显示相应的基于DAMON的操作方案 ``动作`` 试图应用的区域的开始和结束地址、``nr_accesses``
300 和 ``年龄`` 。
301 
302 用例
303 ~~~~
304 
305 下面的命令应用了一个方案:”如果一个大小为[4KiB, 8KiB]的内存区域在[10, 20]的聚合时间间隔内
306 显示出每一个聚合时间间隔[0, 5]的访问量,请分页该区域。对于分页,每秒最多只能使用10ms,而且每
307 秒分页不能超过1GiB。在这一限制下,首先分页出具有较长年龄的内存区域。另外,每5秒钟检查一次系统
308 的可用内存率,当可用内存率低于50%时开始监测和分页,但如果可用内存率大于60%,或低于30%,则停
309 止监测。“ ::
310 
311     # cd <sysfs>/kernel/mm/damon/admin
312     # # populate directories
313     # echo 1 > kdamonds/nr_kdamonds; echo 1 > kdamonds/0/contexts/nr_contexts;
314     # echo 1 > kdamonds/0/contexts/0/schemes/nr_schemes
315     # cd kdamonds/0/contexts/0/schemes/0
316     # # set the basic access pattern and the action
317     # echo 4096 > access_pattern/sz/min
318     # echo 8192 > access_pattern/sz/max
319     # echo 0 > access_pattern/nr_accesses/min
320     # echo 5 > access_pattern/nr_accesses/max
321     # echo 10 > access_pattern/age/min
322     # echo 20 > access_pattern/age/max
323     # echo pageout > action
324     # # set quotas
325     # echo 10 > quotas/ms
326     # echo $((1024*1024*1024)) > quotas/bytes
327     # echo 1000 > quotas/reset_interval_ms
328     # # set watermark
329     # echo free_mem_rate > watermarks/metric
330     # echo 5000000 > watermarks/interval_us
331     # echo 600 > watermarks/high
332     # echo 500 > watermarks/mid
333     # echo 300 > watermarks/low
334 
335 请注意,我们强烈建议使用用户空间的工具,如 `damo <https://github.com/damonitor/damo>`_ ,
336 而不是像上面那样手动读写文件。以上只是一个例子。
337 
338 debugfs接口
339 ===========
340 
341 .. note::
342 
343   DAMON debugfs接口将在下一个LTS内核发布后被移除,所以用户应该转移到
344   :ref:`sysfs接口<sysfs_interface>`。
345 
346 DAMON导出了八个文件, ``attrs``, ``target_ids``, ``init_regions``,
347 ``schemes``, ``monitor_on_DEPRECATED``, ``kdamond_pid``, ``mk_contexts`` 和
348 ``rm_contexts`` under its debugfs directory, ``<debugfs>/damon/``.
349 
350 
351 属性
352 ----
353 
354 用户可以通过读取和写入 ``attrs`` 文件获得和设置 ``采样间隔`` 、 ``聚集间隔`` 、 ``更新间隔``
355 以及监测目标区域的最小/最大数量。要详细了解监测属性,请参考 `:doc:/mm/damon/design` 。例如,
356 下面的命令将这些值设置为5ms、100ms、1000ms、10和1000,然后再次检查::
357 
358     # cd <debugfs>/damon
359     # echo 5000 100000 1000000 10 1000 > attrs
360     # cat attrs
361     5000 100000 1000000 10 1000
362 
363 
364 目标ID
365 ------
366 
367 一些类型的地址空间支持多个监测目标。例如,虚拟内存地址空间的监测可以有多个进程作为监测目标。用户
368 可以通过写入目标的相关id值来设置目标,并通过读取 ``target_ids`` 文件来获得当前目标的id。在监
369 测虚拟地址空间的情况下,这些值应该是监测目标进程的pid。例如,下面的命令将pid为42和4242的进程设
370 为监测目标,并再次检查::
371 
372     # cd <debugfs>/damon
373     # echo 42 4242 > target_ids
374     # cat target_ids
375     42 4242
376 
377 用户还可以通过在文件中写入一个特殊的关键字 "paddr\n" 来监测系统的物理内存地址空间。因为物理地
378 址空间监测不支持多个目标,读取文件会显示一个假值,即 ``42`` ,如下图所示::
379 
380     # cd <debugfs>/damon
381     # echo paddr > target_ids
382     # cat target_ids
383     42
384 
385 请注意,设置目标ID并不启动监测。
386 
387 
388 初始监测目标区域
389 ----------------
390 
391 在虚拟地址空间监测的情况下,DAMON自动设置和更新监测的目标区域,这样就可以覆盖目标进程的整个
392 内存映射。然而,用户可能希望将监测区域限制在特定的地址范围内,如堆、栈或特定的文件映射区域。
393 或者,一些用户可以知道他们工作负载的初始访问模式,因此希望为“自适应区域调整”设置最佳初始区域。
394 
395 相比之下,DAMON在物理内存监测的情况下不会自动设置和更新监测目标区域。因此,用户应该自己设置
396 监测目标区域。
397 
398 在这种情况下,用户可以通过在 ``init_regions`` 文件中写入适当的值,明确地设置他们想要的初
399 始监测目标区域。输入应该是一个由三个整数组成的队列,用空格隔开,代表一个区域的形式如下::
400 
401     <target idx> <start address> <end address>
402 
403 目标idx应该是 ``target_ids`` 文件中目标的索引,从 ``0`` 开始,区域应该按照地址顺序传递。
404 例如,下面的命令将设置几个地址范围, ``1-100`` 和 ``100-200`` 作为pid 42的初始监测目标
405 区域,这是 ``target_ids`` 中的第一个(索引 ``0`` ),另外几个地址范围, ``20-40`` 和
406 ``50-100`` 作为pid 4242的地址,这是 ``target_ids`` 中的第二个(索引 ``1`` )::
407 
408     # cd <debugfs>/damon
409     # cat target_ids
410     42 4242
411     # echo "0   1       100 \
412             0   100     200 \
413             1   20      40  \
414             1   50      100" > init_regions
415 
416 请注意,这只是设置了初始的监测目标区域。在虚拟内存监测的情况下,DAMON会在一个 ``更新间隔``
417 后自动更新区域的边界。因此,在这种情况下,如果用户不希望更新的话,应该把 ``更新间隔`` 设
418 置得足够大。
419 
420 
421 方案
422 ----
423 
424 对于通常的基于DAMON的数据访问感知的内存管理优化,用户只是希望系统对特定访问模式的内存区域应用内
425 存管理操作。DAMON从用户那里接收这种形式化的操作方案,并将这些方案应用到目标进程中。
426 
427 用户可以通过读取和写入 ``scheme`` debugfs文件来获得和设置这些方案。读取该文件还可以显示每个
428 方案的统计数据。在文件中,每一个方案都应该在每一行中以下列形式表示出来::
429 
430     <target access pattern> <action> <quota> <watermarks>
431 
432 你可以通过简单地在文件中写入一个空字符串来禁用方案。
433 
434 目标访问模式
435 ~~~~~~~~~~~~
436 
437 ``<目标访问模式>`` 是由三个范围构成的,形式如下::
438 
439     min-size max-size min-acc max-acc min-age max-age
440 
441 具体来说,区域大小的字节数( `min-size` 和 `max-size` ),访问频率的每聚合区间的监测访问次
442 数( `min-acc` 和 `max-acc` ),区域年龄的聚合区间数( `min-age` 和 `max-age` )都被指定。
443 请注意,这些范围是封闭区间。
444 
445 动作
446 ~~~~
447 
448 ``<action>`` 是一个预定义的内存管理动作的整数,DAMON将应用于具有目标访问模式的区域。支持
449 的数字和它们的含义如下::
450 
451  - 0: Call ``madvise()`` for the region with ``MADV_WILLNEED``
452  - 1: Call ``madvise()`` for the region with ``MADV_COLD``
453  - 2: Call ``madvise()`` for the region with ``MADV_PAGEOUT``
454  - 3: Call ``madvise()`` for the region with ``MADV_HUGEPAGE``
455  - 4: Call ``madvise()`` for the region with ``MADV_NOHUGEPAGE``
456  - 5: Do nothing but count the statistics
457 
458 配额
459 ~~~~
460 
461 每个 ``动作`` 的最佳 ``目标访问模式`` 取决于工作负载,所以不容易找到。更糟糕的是,将某个
462 动作的方案设置得过于激进会导致严重的开销。为了避免这种开销,用户可以通过下面表格中的 ``<quota>``
463 来限制方案的时间和大小配额::
464 
465     <ms> <sz> <reset interval> <priority weights>
466 
467 这使得DAMON在 ``<reset interval>`` 毫秒内,尽量只用 ``<ms>`` 毫秒的时间对 ``目标访
468 问模式`` 的内存区域应用动作,并在 ``<reset interval>`` 内只对最多<sz>字节的内存区域应
469 用动作。将 ``<ms>`` 和 ``<sz>`` 都设置为零,可以禁用配额限制。
470 
471 当预计超过配额限制时,DAMON会根据 ``目标访问模式`` 的大小、访问频率和年龄,对发现的内存
472 区域进行优先排序。为了实现个性化的优先级,用户可以在 ``<优先级权重>`` 中设置这三个属性的
473 权重,具体形式如下::
474 
475     <size weight> <access frequency weight> <age weight>
476 
477 水位
478 ~~~~
479 
480 有些方案需要根据系统特定指标的当前值来运行,如自由内存比率。对于这种情况,用户可以为该条
481 件指定水位。::
482 
483     <metric> <check interval> <high mark> <middle mark> <low mark>
484 
485 ``<metric>`` 是一个预定义的整数,用于要检查的度量。支持的数字和它们的含义如下。
486 
487  - 0: 忽视水位
488  - 1: 系统空闲内存率 (千分比)
489 
490 每隔 ``<检查间隔>`` 微秒检查一次公制的值。
491 
492 如果该值高于 ``<高标>`` 或低于 ``<低标>`` ,该方案被停用。如果该值低于 ``<中标>`` ,
493 该方案将被激活。
494 
495 统计数据
496 ~~~~~~~~
497 
498 它还统计每个方案被尝试应用的区域的总数量和字节数,每个方案被成功应用的区域的两个数量,以
499 及超过配额限制的总数量。这些统计数据可用于在线分析或调整方案。
500 
501 统计数据可以通过读取方案文件来显示。读取该文件将显示你在每一行中输入的每个 ``方案`` ,
502 统计的五个数字将被加在每一行的末尾。
503 
504 例子
505 ~~~~
506 
507 下面的命令应用了一个方案:”如果一个大小为[4KiB, 8KiB]的内存区域在[10, 20]的聚合时间
508 间隔内显示出每一个聚合时间间隔[0, 5]的访问量,请分页出该区域。对于分页,每秒最多只能使
509 用10ms,而且每秒分页不能超过1GiB。在这一限制下,首先分页出具有较长年龄的内存区域。另外,
510 每5秒钟检查一次系统的可用内存率,当可用内存率低于50%时开始监测和分页,但如果可用内存率
511 大于60%,或低于30%,则停止监测“::
512 
513     # cd <debugfs>/damon
514     # scheme="4096 8192  0 5    10 20    2"  # target access pattern and action
515     # scheme+=" 10 $((1024*1024*1024)) 1000" # quotas
516     # scheme+=" 0 0 100"                     # prioritization weights
517     # scheme+=" 1 5000000 600 500 300"       # watermarks
518     # echo "$scheme" > schemes
519 
520 
521 开关
522 ----
523 
524 除非你明确地启动监测,否则如上所述的文件设置不会产生效果。你可以通过写入和读取 ``monitor_on_DEPRECATED``
525 文件来启动、停止和检查监测的当前状态。写入 ``on`` 该文件可以启动对有属性的目标的监测。写入
526 ``off`` 该文件则停止这些目标。如果每个目标进程被终止,DAMON也会停止。下面的示例命令开启、关
527 闭和检查DAMON的状态::
528 
529     # cd <debugfs>/damon
530     # echo on > monitor_on_DEPRECATED
531     # echo off > monitor_on_DEPRECATED
532     # cat monitor_on_DEPRECATED
533     off
534 
535 请注意,当监测开启时,你不能写到上述的debugfs文件。如果你在DAMON运行时写到这些文件,将会返
536 回一个错误代码,如 ``-EBUSY`` 。
537 
538 
539 监测线程PID
540 -----------
541 
542 DAMON通过一个叫做kdamond的内核线程来进行请求监测。你可以通过读取 ``kdamond_pid`` 文件获
543 得该线程的 ``pid`` 。当监测被 ``关闭`` 时,读取该文件不会返回任何信息::
544 
545     # cd <debugfs>/damon
546     # cat monitor_on_DEPRECATED
547     off
548     # cat kdamond_pid
549     none
550     # echo on > monitor_on_DEPRECATED
551     # cat kdamond_pid
552     18594
553 
554 
555 使用多个监测线程
556 ----------------
557 
558 每个监测上下文都会创建一个 ``kdamond`` 线程。你可以使用 ``mk_contexts`` 和 ``rm_contexts``
559 文件为多个 ``kdamond`` 需要的用例创建和删除监测上下文。
560 
561 将新上下文的名称写入 ``mk_contexts`` 文件,在 ``DAMON debugfs`` 目录上创建一个该名称的目录。
562 该目录将有该上下文的 ``DAMON debugfs`` 文件::
563 
564     # cd <debugfs>/damon
565     # ls foo
566     # ls: cannot access 'foo': No such file or directory
567     # echo foo > mk_contexts
568     # ls foo
569     # attrs  init_regions  kdamond_pid  schemes  target_ids
570 
571 如果不再需要上下文,你可以通过把上下文的名字放到 ``rm_contexts`` 文件中来删除它和相应的目录::
572 
573     # echo foo > rm_contexts
574     # ls foo
575     # ls: cannot access 'foo': No such file or directory
576 
577 注意, ``mk_contexts`` 、 ``rm_contexts`` 和 ``monitor_on_DEPRECATED`` 文件只在根目录下。
578 
579 
580 监测结果的监测点
581 ================
582 
583 DAMON通过一个tracepoint ``damon:damon_aggregated`` 提供监测结果.  当监测开启时,你可
584 以记录追踪点事件,并使用追踪点支持工具如perf显示结果。比如说::
585 
586     # echo on > monitor_on_DEPRECATED
587     # perf record -e damon:damon_aggregated &
588     # sleep 5
589     # kill 9 $(pidof perf)
590     # echo off > monitor_on_DEPRECATED
591     # perf script

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php