193b51a10SYanteng Si.. SPDX-License-Identifier: GPL-2.0 293b51a10SYanteng Si.. include:: ../../../disclaimer-zh_CN.rst 393b51a10SYanteng Si 493b51a10SYanteng Si:Original: Documentation/admin-guide/mm/damon/usage.rst 593b51a10SYanteng Si 693b51a10SYanteng Si:翻译: 793b51a10SYanteng Si 893b51a10SYanteng Si 司延腾 Yanteng Si <siyanteng@loongson.cn> 993b51a10SYanteng Si 1093b51a10SYanteng Si:校译: 1193b51a10SYanteng Si 1293b51a10SYanteng Si======== 1393b51a10SYanteng Si详细用法 1493b51a10SYanteng Si======== 1593b51a10SYanteng Si 16b22fe865SYanteng SiDAMON 为不同的用户提供了下面这些接口。 1793b51a10SYanteng Si 1893b51a10SYanteng Si- *DAMON用户空间工具。* 1993b51a10SYanteng Si `这 <https://github.com/awslabs/damo>`_ 为有这特权的人, 如系统管理员,希望有一个刚好 2093b51a10SYanteng Si 可以工作的人性化界面。 2193b51a10SYanteng Si 使用它,用户可以以人性化的方式使用DAMON的主要功能。不过,它可能不会为特殊情况进行高度调整。 2293b51a10SYanteng Si 它同时支持虚拟和物理地址空间的监测。更多细节,请参考它的 `使用文档 2393b51a10SYanteng Si <https://github.com/awslabs/damo/blob/next/USAGE.md>`_。 24b22fe865SYanteng Si- *sysfs接口。* 25b22fe865SYanteng Si :ref:`这 <sysfs_interface>` 是为那些希望更高级的使用DAMON的特权用户空间程序员准备的。 26b22fe865SYanteng Si 使用它,用户可以通过读取和写入特殊的sysfs文件来使用DAMON的主要功能。因此,你可以编写和使 27b22fe865SYanteng Si 用你个性化的DAMON sysfs包装程序,代替你读/写sysfs文件。 `DAMON用户空间工具 2893b51a10SYanteng Si <https://github.com/awslabs/damo>`_ 就是这种程序的一个例子 它同时支持虚拟和物理地址 2993b51a10SYanteng Si 空间的监测。注意,这个界面只提供简单的监测结果 :ref:`统计 <damos_stats>`。对于详细的监测 3093b51a10SYanteng Si 结果,DAMON提供了一个:ref:`跟踪点 <tracepoint>`。 31b22fe865SYanteng Si- *debugfs interface.* 32b22fe865SYanteng Si :ref:`这 <debugfs_interface>` 几乎与:ref:`sysfs interface <sysfs_interface>` 接 33b22fe865SYanteng Si 口相同。这将在下一个LTS内核发布后被移除,所以用户应该转移到 34b22fe865SYanteng Si :ref:`sysfs interface <sysfs_interface>`。 3593b51a10SYanteng Si- *内核空间编程接口。* 36ee65728eSMike Rapoport :doc:`这 </mm/damon/api>` 这是为内核空间程序员准备的。使用它,用户可以通过为你编写内 3793b51a10SYanteng Si 核空间的DAMON应用程序,最灵活有效地利用DAMON的每一个功能。你甚至可以为各种地址空间扩展DAMON。 38ee65728eSMike Rapoport 详细情况请参考接口 :doc:`文件 </mm/damon/api>`。 3993b51a10SYanteng Si 40b22fe865SYanteng Sisysfs接口 41b22fe865SYanteng Si========= 42b22fe865SYanteng SiDAMON的sysfs接口是在定义 ``CONFIG_DAMON_SYSFS`` 时建立的。它在其sysfs目录下创建多 43b22fe865SYanteng Si个目录和文件, ``<sysfs>/kernel/mm/damon/`` 。你可以通过对该目录下的文件进行写入和 44b22fe865SYanteng Si读取来控制DAMON。 45b22fe865SYanteng Si 46b22fe865SYanteng Si对于一个简短的例子,用户可以监测一个给定工作负载的虚拟地址空间,如下所示:: 47b22fe865SYanteng Si 48b22fe865SYanteng Si # cd /sys/kernel/mm/damon/admin/ 49*7cb52d4bSYanteng Si # echo 1 > kdamonds/nr_kdamonds && echo 1 > kdamonds/0/contexts/nr_contexts 50b22fe865SYanteng Si # echo vaddr > kdamonds/0/contexts/0/operations 51*7cb52d4bSYanteng Si # echo 1 > kdamonds/0/contexts/0/targets/nr_targets 52*7cb52d4bSYanteng Si # echo $(pidof <workload>) > kdamonds/0/contexts/0/targets/0/pid_target 53b22fe865SYanteng Si # echo on > kdamonds/0/state 54b22fe865SYanteng Si 55b22fe865SYanteng Si文件层次结构 56b22fe865SYanteng Si------------ 57b22fe865SYanteng Si 58b22fe865SYanteng SiDAMON sysfs接口的文件层次结构如下图所示。在下图中,父子关系用缩进表示,每个目录有 59b22fe865SYanteng Si``/`` 后缀,每个目录中的文件用逗号(",")分开。 :: 60b22fe865SYanteng Si 61b22fe865SYanteng Si /sys/kernel/mm/damon/admin 62b22fe865SYanteng Si │ kdamonds/nr_kdamonds 63b22fe865SYanteng Si │ │ 0/state,pid 64b22fe865SYanteng Si │ │ │ contexts/nr_contexts 65b22fe865SYanteng Si │ │ │ │ 0/operations 66b22fe865SYanteng Si │ │ │ │ │ monitoring_attrs/ 67b22fe865SYanteng Si │ │ │ │ │ │ intervals/sample_us,aggr_us,update_us 68b22fe865SYanteng Si │ │ │ │ │ │ nr_regions/min,max 69b22fe865SYanteng Si │ │ │ │ │ targets/nr_targets 70b22fe865SYanteng Si │ │ │ │ │ │ 0/pid_target 71b22fe865SYanteng Si │ │ │ │ │ │ │ regions/nr_regions 72b22fe865SYanteng Si │ │ │ │ │ │ │ │ 0/start,end 73b22fe865SYanteng Si │ │ │ │ │ │ │ │ ... 74b22fe865SYanteng Si │ │ │ │ │ │ ... 75b22fe865SYanteng Si │ │ │ │ │ schemes/nr_schemes 76b22fe865SYanteng Si │ │ │ │ │ │ 0/action 77b22fe865SYanteng Si │ │ │ │ │ │ │ access_pattern/ 78b22fe865SYanteng Si │ │ │ │ │ │ │ │ sz/min,max 79b22fe865SYanteng Si │ │ │ │ │ │ │ │ nr_accesses/min,max 80b22fe865SYanteng Si │ │ │ │ │ │ │ │ age/min,max 81b22fe865SYanteng Si │ │ │ │ │ │ │ quotas/ms,bytes,reset_interval_ms 82b22fe865SYanteng Si │ │ │ │ │ │ │ │ weights/sz_permil,nr_accesses_permil,age_permil 83b22fe865SYanteng Si │ │ │ │ │ │ │ watermarks/metric,interval_us,high,mid,low 84b22fe865SYanteng Si │ │ │ │ │ │ │ stats/nr_tried,sz_tried,nr_applied,sz_applied,qt_exceeds 85*7cb52d4bSYanteng Si │ │ │ │ │ │ │ tried_regions/ 86*7cb52d4bSYanteng Si │ │ │ │ │ │ │ │ 0/start,end,nr_accesses,age 87*7cb52d4bSYanteng Si │ │ │ │ │ │ │ │ ... 88b22fe865SYanteng Si │ │ │ │ │ │ ... 89b22fe865SYanteng Si │ │ │ │ ... 90b22fe865SYanteng Si │ │ ... 91b22fe865SYanteng Si 92b22fe865SYanteng Si根 93b22fe865SYanteng Si-- 94b22fe865SYanteng Si 95b22fe865SYanteng SiDAMON sysfs接口的根是 ``<sysfs>/kernel/mm/damon/`` ,它有一个名为 ``admin`` 的 96b22fe865SYanteng Si目录。该目录包含特权用户空间程序控制DAMON的文件。拥有根权限的用户空间工具或deamons可以 97b22fe865SYanteng Si使用这个目录。 98b22fe865SYanteng Si 99b22fe865SYanteng Sikdamonds/ 100b22fe865SYanteng Si--------- 101b22fe865SYanteng Si 102b22fe865SYanteng Si与监测相关的信息包括请求规格和结果被称为DAMON上下文。DAMON用一个叫做kdamond的内核线程 103b22fe865SYanteng Si执行每个上下文,多个kdamonds可以并行运行。 104b22fe865SYanteng Si 105b22fe865SYanteng Si在 ``admin`` 目录下,有一个目录,即``kdamonds``,它有控制kdamonds的文件存在。在开始 106b22fe865SYanteng Si时,这个目录只有一个文件,``nr_kdamonds``。向该文件写入一个数字(``N``),就会创建名为 107b22fe865SYanteng Si``0`` 到 ``N-1`` 的子目录数量。每个目录代表每个kdamond。 108b22fe865SYanteng Si 109b22fe865SYanteng Sikdamonds/<N>/ 110b22fe865SYanteng Si------------- 111b22fe865SYanteng Si 112b22fe865SYanteng Si在每个kdamond目录中,存在两个文件(``state`` 和 ``pid`` )和一个目录( ``contexts`` )。 113b22fe865SYanteng Si 114b22fe865SYanteng Si读取 ``state`` 时,如果kdamond当前正在运行,则返回 ``on`` ,如果没有运行则返回 ``off`` 。 115b22fe865SYanteng Si写入 ``on`` 或 ``off`` 使kdamond处于状态。向 ``state`` 文件写 ``update_schemes_stats`` , 116b22fe865SYanteng Si更新kdamond的每个基于DAMON的操作方案的统计文件的内容。关于统计信息的细节,请参考 117*7cb52d4bSYanteng Si:ref:`stats section <sysfs_schemes_stats>`. 将 ``update_schemes_tried_regions`` 写到 118*7cb52d4bSYanteng Si``state`` 文件,为kdamond的每个基于DAMON的操作方案,更新基于DAMON的操作方案动作的尝试区域目录。 119*7cb52d4bSYanteng Si将`clear_schemes_tried_regions`写入`state`文件,清除kdamond的每个基于DAMON的操作方案的动作 120*7cb52d4bSYanteng Si尝试区域目录。 关于基于DAMON的操作方案动作尝试区域目录的细节,请参考:ref:tried_regions 部分 121*7cb52d4bSYanteng Si<sysfs_schemes_tried_regions>`。 122b22fe865SYanteng Si 123b22fe865SYanteng Si如果状态为 ``on``,读取 ``pid`` 显示kdamond线程的pid。 124b22fe865SYanteng Si 125b22fe865SYanteng Si``contexts`` 目录包含控制这个kdamond要执行的监测上下文的文件。 126b22fe865SYanteng Si 127b22fe865SYanteng Sikdamonds/<N>/contexts/ 128b22fe865SYanteng Si---------------------- 129b22fe865SYanteng Si 130b22fe865SYanteng Si在开始时,这个目录只有一个文件,即 ``nr_contexts`` 。向该文件写入一个数字( ``N`` ),就会创 131b22fe865SYanteng Si建名为``0`` 到 ``N-1`` 的子目录数量。每个目录代表每个监测背景。目前,每个kdamond只支持 132b22fe865SYanteng Si一个上下文,所以只有 ``0`` 或 ``1`` 可以被写入文件。 133b22fe865SYanteng Si 134b22fe865SYanteng Sicontexts/<N>/ 135b22fe865SYanteng Si------------- 136b22fe865SYanteng Si 137b22fe865SYanteng Si在每个上下文目录中,存在一个文件(``operations``)和三个目录(``monitoring_attrs``, 138b22fe865SYanteng Si``targets``, 和 ``schemes``)。 139b22fe865SYanteng Si 140b22fe865SYanteng SiDAMON支持多种类型的监测操作,包括对虚拟地址空间和物理地址空间的监测。你可以通过向文件 141b22fe865SYanteng Si中写入以下关键词之一,并从文件中读取,来设置和获取DAMON将为上下文使用何种类型的监测操作。 142b22fe865SYanteng Si 143b22fe865SYanteng Si - vaddr: 监测特定进程的虚拟地址空间 144b22fe865SYanteng Si - paddr: 监视系统的物理地址空间 145b22fe865SYanteng Si 146b22fe865SYanteng Sicontexts/<N>/monitoring_attrs/ 147b22fe865SYanteng Si------------------------------ 148b22fe865SYanteng Si 149b22fe865SYanteng Si用于指定监测属性的文件,包括所需的监测质量和效率,都在 ``monitoring_attrs`` 目录中。 150b22fe865SYanteng Si具体来说,这个目录下有两个目录,即 ``intervals`` 和 ``nr_regions`` 。 151b22fe865SYanteng Si 152b22fe865SYanteng Si在 ``intervals`` 目录下,存在DAMON的采样间隔(``sample_us``)、聚集间隔(``aggr_us``) 153b22fe865SYanteng Si和更新间隔(``update_us``)三个文件。你可以通过写入和读出这些文件来设置和获取微秒级的值。 154b22fe865SYanteng Si 155b22fe865SYanteng Si在 ``nr_regions`` 目录下,有两个文件分别用于DAMON监测区域的下限和上限(``min`` 和 ``max`` ), 156b22fe865SYanteng Si这两个文件控制着监测的开销。你可以通过向这些文件的写入和读出来设置和获取这些值。 157b22fe865SYanteng Si 158ee65728eSMike Rapoport关于间隔和监测区域范围的更多细节,请参考设计文件 (:doc:`/mm/damon/design`)。 159b22fe865SYanteng Si 160b22fe865SYanteng Sicontexts/<N>/targets/ 161b22fe865SYanteng Si--------------------- 162b22fe865SYanteng Si 163b22fe865SYanteng Si在开始时,这个目录只有一个文件 ``nr_targets`` 。向该文件写入一个数字(``N``),就可以创建 164b22fe865SYanteng Si名为 ``0`` 到 ``N-1`` 的子目录的数量。每个目录代表每个监测目标。 165b22fe865SYanteng Si 166b22fe865SYanteng Sitargets/<N>/ 167b22fe865SYanteng Si------------ 168b22fe865SYanteng Si 169b22fe865SYanteng Si在每个目标目录中,存在一个文件(``pid_target``)和一个目录(``regions``)。 170b22fe865SYanteng Si 171b22fe865SYanteng Si如果你把 ``vaddr`` 写到 ``contexts/<N>/operations`` 中,每个目标应该是一个进程。你 172b22fe865SYanteng Si可以通过将进程的pid写到 ``pid_target`` 文件中来指定DAMON的进程。 173b22fe865SYanteng Si 174b22fe865SYanteng Sitargets/<N>/regions 175b22fe865SYanteng Si------------------- 176b22fe865SYanteng Si 177b22fe865SYanteng Si当使用 ``vaddr`` 监测操作集时( ``vaddr`` 被写入 ``contexts/<N>/operations`` 文 178b22fe865SYanteng Si件),DAMON自动设置和更新监测目标区域,这样就可以覆盖目标进程的整个内存映射。然而,用户可 179b22fe865SYanteng Si能希望将初始监测区域设置为特定的地址范围。 180b22fe865SYanteng Si 181b22fe865SYanteng Si相反,当使用 ``paddr`` 监测操作集时,DAMON不会自动设置和更新监测目标区域( ``paddr`` 182b22fe865SYanteng Si被写入 ``contexts/<N>/operations`` 中)。因此,在这种情况下,用户应该自己设置监测目标 183b22fe865SYanteng Si区域。 184b22fe865SYanteng Si 185b22fe865SYanteng Si在这种情况下,用户可以按照自己的意愿明确设置初始监测目标区域,将适当的值写入该目录下的文件。 186b22fe865SYanteng Si 187b22fe865SYanteng Si开始时,这个目录只有一个文件, ``nr_regions`` 。向该文件写入一个数字(``N``),就可以创 188b22fe865SYanteng Si建名为 ``0`` 到 ``N-1`` 的子目录。每个目录代表每个初始监测目标区域。 189b22fe865SYanteng Si 190b22fe865SYanteng Siregions/<N>/ 191b22fe865SYanteng Si------------ 192b22fe865SYanteng Si 193b22fe865SYanteng Si在每个区域目录中,你会发现两个文件( ``start`` 和 ``end`` )。你可以通过向文件写入 194b22fe865SYanteng Si和从文件中读出,分别设置和获得初始监测目标区域的起始和结束地址。 195b22fe865SYanteng Si 196*7cb52d4bSYanteng Si每个区域不应该与其他区域重叠。 目录“N”的“结束”应等于或小于目录“N+1”的“开始”。 197*7cb52d4bSYanteng Si 198b22fe865SYanteng Sicontexts/<N>/schemes/ 199b22fe865SYanteng Si--------------------- 200b22fe865SYanteng Si 201b22fe865SYanteng Si对于一版的基于DAMON的数据访问感知的内存管理优化,用户通常希望系统对特定访问模式的内存区 202b22fe865SYanteng Si域应用内存管理操作。DAMON从用户那里接收这种形式化的操作方案,并将这些方案应用于目标内存 203b22fe865SYanteng Si区域。用户可以通过读取和写入这个目录下的文件来获得和设置这些方案。 204b22fe865SYanteng Si 205b22fe865SYanteng Si在开始时,这个目录只有一个文件,``nr_schemes``。向该文件写入一个数字(``N``),就可以 206b22fe865SYanteng Si创建名为``0``到``N-1``的子目录的数量。每个目录代表每个基于DAMON的操作方案。 207b22fe865SYanteng Si 208b22fe865SYanteng Sischemes/<N>/ 209b22fe865SYanteng Si------------ 210b22fe865SYanteng Si 211*7cb52d4bSYanteng Si在每个方案目录中,存在五个目录(``access_pattern``、``quotas``、``watermarks``、 212*7cb52d4bSYanteng Si``stats`` 和 ``tried_regions``)和一个文件(``action``)。 213b22fe865SYanteng Si 214b22fe865SYanteng Si``action`` 文件用于设置和获取你想应用于具有特定访问模式的内存区域的动作。可以写入文件 215b22fe865SYanteng Si和从文件中读取的关键词及其含义如下。 216b22fe865SYanteng Si 217b22fe865SYanteng Si - ``willneed``: 对有 ``MADV_WILLNEED`` 的区域调用 ``madvise()`` 。 218b22fe865SYanteng Si - ``cold``: 对具有 ``MADV_COLD`` 的区域调用 ``madvise()`` 。 219b22fe865SYanteng Si - ``pageout``: 为具有 ``MADV_PAGEOUT`` 的区域调用 ``madvise()`` 。 220b22fe865SYanteng Si - ``hugepage``: 为带有 ``MADV_HUGEPAGE`` 的区域调用 ``madvise()`` 。 221b22fe865SYanteng Si - ``nohugepage``: 为带有 ``MADV_NOHUGEPAGE`` 的区域调用 ``madvise()``。 22283b41bb2SYanteng Si - ``lru_prio``: 在其LRU列表上对区域进行优先排序。 22383b41bb2SYanteng Si - ``lru_deprio``: 对区域的LRU列表进行降低优先处理。 224b22fe865SYanteng Si - ``stat``: 什么都不做,只计算统计数据 225b22fe865SYanteng Si 226b22fe865SYanteng Sischemes/<N>/access_pattern/ 227b22fe865SYanteng Si--------------------------- 228b22fe865SYanteng Si 229b22fe865SYanteng Si每个基于DAMON的操作方案的目标访问模式由三个范围构成,包括以字节为单位的区域大小、每个 230b22fe865SYanteng Si聚合区间的监测访问次数和区域年龄的聚合区间数。 231b22fe865SYanteng Si 232b22fe865SYanteng Si在 ``access_pattern`` 目录下,存在三个目录( ``sz``, ``nr_accesses``, 和 ``age`` ), 233b22fe865SYanteng Si每个目录有两个文件(``min`` 和 ``max`` )。你可以通过向 ``sz``, ``nr_accesses``, 和 234b22fe865SYanteng Si``age`` 目录下的 ``min`` 和 ``max`` 文件分别写入和读取来设置和获取给定方案的访问模式。 235b22fe865SYanteng Si 236b22fe865SYanteng Sischemes/<N>/quotas/ 237b22fe865SYanteng Si------------------- 238b22fe865SYanteng Si 239b22fe865SYanteng Si每个 ``动作`` 的最佳 ``目标访问模式`` 取决于工作负载,所以不容易找到。更糟糕的是,将某些动作 240b22fe865SYanteng Si的方案设置得过于激进会造成严重的开销。为了避免这种开销,用户可以为每个方案限制时间和大小配额。 241*7cb52d4bSYanteng Si具体来说,用户可以要求DAMON尽量只使用特定的时间(``时间配额``)来应用动作,并且在给定的时间间 242*7cb52d4bSYanteng Si隔(``重置间隔``)内,只对具有目标访问模式的内存区域应用动作,而不使用特定数量(``大小配额``)。 243b22fe865SYanteng Si 244b22fe865SYanteng Si当预计超过配额限制时,DAMON会根据 ``目标访问模式`` 的大小、访问频率和年龄,对找到的内存区域 245b22fe865SYanteng Si进行优先排序。为了进行个性化的优先排序,用户可以为这三个属性设置权重。 246b22fe865SYanteng Si 247b22fe865SYanteng Si在 ``quotas`` 目录下,存在三个文件(``ms``, ``bytes``, ``reset_interval_ms``)和一个 248b22fe865SYanteng Si目录(``weights``),其中有三个文件(``sz_permil``, ``nr_accesses_permil``, 和 249b22fe865SYanteng Si``age_permil``)。 250b22fe865SYanteng Si 251b22fe865SYanteng Si你可以设置以毫秒为单位的 ``时间配额`` ,以字节为单位的 ``大小配额`` ,以及以毫秒为单位的 ``重 252b22fe865SYanteng Si置间隔`` ,分别向这三个文件写入数值。你还可以通过向 ``weights`` 目录下的三个文件写入数值来设 253b22fe865SYanteng Si置大小、访问频率和年龄的优先权,单位为千分之一。 254b22fe865SYanteng Si 255b22fe865SYanteng Sischemes/<N>/watermarks/ 256b22fe865SYanteng Si----------------------- 257b22fe865SYanteng Si 258b22fe865SYanteng Si为了便于根据系统状态激活和停用每个方案,DAMON提供了一个称为水位的功能。该功能接收五个值,称为 259b22fe865SYanteng Si``度量`` 、``间隔`` 、``高`` 、``中`` 、``低`` 。``度量值`` 是指可以测量的系统度量值,如 260b22fe865SYanteng Si自由内存比率。如果系统的度量值 ``高`` 于memoent的高值或 ``低`` 于低值,则该方案被停用。如果 261b22fe865SYanteng Si该值低于 ``中`` ,则该方案被激活。 262b22fe865SYanteng Si 263b22fe865SYanteng Si在水位目录下,存在五个文件(``metric``, ``interval_us``,``high``, ``mid``, and ``low``) 264b22fe865SYanteng Si用于设置每个值。你可以通过向这些文件的写入来分别设置和获取这五个值。 265b22fe865SYanteng Si 266b22fe865SYanteng Si可以写入 ``metric`` 文件的关键词和含义如下。 267b22fe865SYanteng Si 268b22fe865SYanteng Si - none: 忽略水位 269b22fe865SYanteng Si - free_mem_rate: 系统的自由内存率(千分比)。 270b22fe865SYanteng Si 271b22fe865SYanteng Si``interval`` 应以微秒为单位写入。 272b22fe865SYanteng Si 273b22fe865SYanteng Sischemes/<N>/stats/ 274b22fe865SYanteng Si------------------ 275b22fe865SYanteng Si 276b22fe865SYanteng SiDAMON统计每个方案被尝试应用的区域的总数量和字节数,每个方案被成功应用的区域的两个数字,以及 277b22fe865SYanteng Si超过配额限制的总数量。这些统计数据可用于在线分析或调整方案。 278b22fe865SYanteng Si 279b22fe865SYanteng Si可以通过读取 ``stats`` 目录下的文件(``nr_tried``, ``sz_tried``, ``nr_applied``, 280b22fe865SYanteng Si``sz_applied``, 和 ``qt_exceeds``))分别检索这些统计数据。这些文件不是实时更新的,所以 281b22fe865SYanteng Si你应该要求DAMON sysfs接口通过在相关的 ``kdamonds/<N>/state`` 文件中写入一个特殊的关键字 282b22fe865SYanteng Si``update_schemes_stats`` 来更新统计信息的文件内容。 283b22fe865SYanteng Si 284*7cb52d4bSYanteng Sischemes/<N>/tried_regions/ 285*7cb52d4bSYanteng Si-------------------------- 286*7cb52d4bSYanteng Si 287*7cb52d4bSYanteng Si当一个特殊的关键字 ``update_schemes_tried_regions`` 被写入相关的 ``kdamonds/<N>/state`` 288*7cb52d4bSYanteng Si文件时,DAMON会在这个目录下创建从 ``0`` 开始命名的整数目录。每个目录包含的文件暴露了关于每个 289*7cb52d4bSYanteng Si内存区域的详细信息,在下一个 :ref:`聚集区间 <sysfs_monitoring_attrs>`,相应的方案的 ``动作`` 290*7cb52d4bSYanteng Si已经尝试在这个目录下应用。这些信息包括地址范围、``nr_accesses`` 以及区域的 ``年龄`` 。 291*7cb52d4bSYanteng Si 292*7cb52d4bSYanteng Si当另一个特殊的关键字 ``clear_schemes_tried_regions`` 被写入相关的 ``kdamonds/<N>/state`` 293*7cb52d4bSYanteng Si文件时,这些目录将被删除。 294*7cb52d4bSYanteng Si 295*7cb52d4bSYanteng Sitried_regions/<N>/ 296*7cb52d4bSYanteng Si------------------ 297*7cb52d4bSYanteng Si 298*7cb52d4bSYanteng Si在每个区域目录中,你会发现四个文件(``start``, ``end``, ``nr_accesses``, and ``age``)。 299*7cb52d4bSYanteng Si读取这些文件将显示相应的基于DAMON的操作方案 ``动作`` 试图应用的区域的开始和结束地址、``nr_accesses`` 300*7cb52d4bSYanteng Si和 ``年龄`` 。 301*7cb52d4bSYanteng Si 302b22fe865SYanteng Si用例 303b22fe865SYanteng Si~~~~ 304b22fe865SYanteng Si 305b22fe865SYanteng Si下面的命令应用了一个方案:”如果一个大小为[4KiB, 8KiB]的内存区域在[10, 20]的聚合时间间隔内 306b22fe865SYanteng Si显示出每一个聚合时间间隔[0, 5]的访问量,请分页该区域。对于分页,每秒最多只能使用10ms,而且每 307b22fe865SYanteng Si秒分页不能超过1GiB。在这一限制下,首先分页出具有较长年龄的内存区域。另外,每5秒钟检查一次系统 308b22fe865SYanteng Si的可用内存率,当可用内存率低于50%时开始监测和分页,但如果可用内存率大于60%,或低于30%,则停 309b22fe865SYanteng Si止监测。“ :: 310b22fe865SYanteng Si 311b22fe865SYanteng Si # cd <sysfs>/kernel/mm/damon/admin 312b22fe865SYanteng Si # # populate directories 313b22fe865SYanteng Si # echo 1 > kdamonds/nr_kdamonds; echo 1 > kdamonds/0/contexts/nr_contexts; 314b22fe865SYanteng Si # echo 1 > kdamonds/0/contexts/0/schemes/nr_schemes 315b22fe865SYanteng Si # cd kdamonds/0/contexts/0/schemes/0 316b22fe865SYanteng Si # # set the basic access pattern and the action 317*7cb52d4bSYanteng Si # echo 4096 > access_pattern/sz/min 318*7cb52d4bSYanteng Si # echo 8192 > access_pattern/sz/max 319*7cb52d4bSYanteng Si # echo 0 > access_pattern/nr_accesses/min 320*7cb52d4bSYanteng Si # echo 5 > access_pattern/nr_accesses/max 321*7cb52d4bSYanteng Si # echo 10 > access_pattern/age/min 322*7cb52d4bSYanteng Si # echo 20 > access_pattern/age/max 323b22fe865SYanteng Si # echo pageout > action 324b22fe865SYanteng Si # # set quotas 325b22fe865SYanteng Si # echo 10 > quotas/ms 326b22fe865SYanteng Si # echo $((1024*1024*1024)) > quotas/bytes 327b22fe865SYanteng Si # echo 1000 > quotas/reset_interval_ms 328b22fe865SYanteng Si # # set watermark 329b22fe865SYanteng Si # echo free_mem_rate > watermarks/metric 330b22fe865SYanteng Si # echo 5000000 > watermarks/interval_us 331b22fe865SYanteng Si # echo 600 > watermarks/high 332b22fe865SYanteng Si # echo 500 > watermarks/mid 333b22fe865SYanteng Si # echo 300 > watermarks/low 334b22fe865SYanteng Si 335b22fe865SYanteng Si请注意,我们强烈建议使用用户空间的工具,如 `damo <https://github.com/awslabs/damo>`_ , 336b22fe865SYanteng Si而不是像上面那样手动读写文件。以上只是一个例子。 33793b51a10SYanteng Si 33893b51a10SYanteng Sidebugfs接口 33993b51a10SYanteng Si=========== 34093b51a10SYanteng Si 341*7cb52d4bSYanteng Si.. note:: 342*7cb52d4bSYanteng Si 343*7cb52d4bSYanteng Si DAMON debugfs接口将在下一个LTS内核发布后被移除,所以用户应该转移到 344*7cb52d4bSYanteng Si :ref:`sysfs接口<sysfs_interface>`。 345*7cb52d4bSYanteng Si 34693b51a10SYanteng SiDAMON导出了八个文件, ``attrs``, ``target_ids``, ``init_regions``, 34793b51a10SYanteng Si``schemes``, ``monitor_on``, ``kdamond_pid``, ``mk_contexts`` 和 34893b51a10SYanteng Si``rm_contexts`` under its debugfs directory, ``<debugfs>/damon/``. 34993b51a10SYanteng Si 35093b51a10SYanteng Si 35193b51a10SYanteng Si属性 35293b51a10SYanteng Si---- 35393b51a10SYanteng Si 354c57f3dbcSYanteng Si用户可以通过读取和写入 ``attrs`` 文件获得和设置 ``采样间隔`` 、 ``聚集间隔`` 、 ``更新间隔`` 355ee65728eSMike Rapoport以及监测目标区域的最小/最大数量。要详细了解监测属性,请参考 `:doc:/mm/damon/design` 。例如, 35693b51a10SYanteng Si下面的命令将这些值设置为5ms、100ms、1000ms、10和1000,然后再次检查:: 35793b51a10SYanteng Si 35893b51a10SYanteng Si # cd <debugfs>/damon 35993b51a10SYanteng Si # echo 5000 100000 1000000 10 1000 > attrs 36093b51a10SYanteng Si # cat attrs 36193b51a10SYanteng Si 5000 100000 1000000 10 1000 36293b51a10SYanteng Si 36393b51a10SYanteng Si 36493b51a10SYanteng Si目标ID 36593b51a10SYanteng Si------ 36693b51a10SYanteng Si 36793b51a10SYanteng Si一些类型的地址空间支持多个监测目标。例如,虚拟内存地址空间的监测可以有多个进程作为监测目标。用户 36893b51a10SYanteng Si可以通过写入目标的相关id值来设置目标,并通过读取 ``target_ids`` 文件来获得当前目标的id。在监 36993b51a10SYanteng Si测虚拟地址空间的情况下,这些值应该是监测目标进程的pid。例如,下面的命令将pid为42和4242的进程设 37093b51a10SYanteng Si为监测目标,并再次检查:: 37193b51a10SYanteng Si 37293b51a10SYanteng Si # cd <debugfs>/damon 37393b51a10SYanteng Si # echo 42 4242 > target_ids 37493b51a10SYanteng Si # cat target_ids 37593b51a10SYanteng Si 42 4242 37693b51a10SYanteng Si 37793b51a10SYanteng Si用户还可以通过在文件中写入一个特殊的关键字 "paddr\n" 来监测系统的物理内存地址空间。因为物理地 37893b51a10SYanteng Si址空间监测不支持多个目标,读取文件会显示一个假值,即 ``42`` ,如下图所示:: 37993b51a10SYanteng Si 38093b51a10SYanteng Si # cd <debugfs>/damon 38193b51a10SYanteng Si # echo paddr > target_ids 38293b51a10SYanteng Si # cat target_ids 38393b51a10SYanteng Si 42 38493b51a10SYanteng Si 38593b51a10SYanteng Si请注意,设置目标ID并不启动监测。 38693b51a10SYanteng Si 38793b51a10SYanteng Si 38893b51a10SYanteng Si初始监测目标区域 38993b51a10SYanteng Si---------------- 39093b51a10SYanteng Si 39193b51a10SYanteng Si在虚拟地址空间监测的情况下,DAMON自动设置和更新监测的目标区域,这样就可以覆盖目标进程的整个 39293b51a10SYanteng Si内存映射。然而,用户可能希望将监测区域限制在特定的地址范围内,如堆、栈或特定的文件映射区域。 39393b51a10SYanteng Si或者,一些用户可以知道他们工作负载的初始访问模式,因此希望为“自适应区域调整”设置最佳初始区域。 39493b51a10SYanteng Si 39593b51a10SYanteng Si相比之下,DAMON在物理内存监测的情况下不会自动设置和更新监测目标区域。因此,用户应该自己设置 39693b51a10SYanteng Si监测目标区域。 39793b51a10SYanteng Si 39893b51a10SYanteng Si在这种情况下,用户可以通过在 ``init_regions`` 文件中写入适当的值,明确地设置他们想要的初 399*7cb52d4bSYanteng Si始监测目标区域。输入应该是一个由三个整数组成的队列,用空格隔开,代表一个区域的形式如下:: 40093b51a10SYanteng Si 40193b51a10SYanteng Si <target idx> <start address> <end address> 40293b51a10SYanteng Si 40393b51a10SYanteng Si目标idx应该是 ``target_ids`` 文件中目标的索引,从 ``0`` 开始,区域应该按照地址顺序传递。 40493b51a10SYanteng Si例如,下面的命令将设置几个地址范围, ``1-100`` 和 ``100-200`` 作为pid 42的初始监测目标 40593b51a10SYanteng Si区域,这是 ``target_ids`` 中的第一个(索引 ``0`` ),另外几个地址范围, ``20-40`` 和 40693b51a10SYanteng Si``50-100`` 作为pid 4242的地址,这是 ``target_ids`` 中的第二个(索引 ``1`` ):: 40793b51a10SYanteng Si 40893b51a10SYanteng Si # cd <debugfs>/damon 40993b51a10SYanteng Si # cat target_ids 41093b51a10SYanteng Si 42 4242 411*7cb52d4bSYanteng Si # echo "0 1 100 \ 412*7cb52d4bSYanteng Si 0 100 200 \ 413*7cb52d4bSYanteng Si 1 20 40 \ 41493b51a10SYanteng Si 1 50 100" > init_regions 41593b51a10SYanteng Si 416c57f3dbcSYanteng Si请注意,这只是设置了初始的监测目标区域。在虚拟内存监测的情况下,DAMON会在一个 ``更新间隔`` 417c57f3dbcSYanteng Si后自动更新区域的边界。因此,在这种情况下,如果用户不希望更新的话,应该把 ``更新间隔`` 设 41893b51a10SYanteng Si置得足够大。 41993b51a10SYanteng Si 42093b51a10SYanteng Si 42193b51a10SYanteng Si方案 42293b51a10SYanteng Si---- 42393b51a10SYanteng Si 42493b51a10SYanteng Si对于通常的基于DAMON的数据访问感知的内存管理优化,用户只是希望系统对特定访问模式的内存区域应用内 42593b51a10SYanteng Si存管理操作。DAMON从用户那里接收这种形式化的操作方案,并将这些方案应用到目标进程中。 42693b51a10SYanteng Si 42793b51a10SYanteng Si用户可以通过读取和写入 ``scheme`` debugfs文件来获得和设置这些方案。读取该文件还可以显示每个 42893b51a10SYanteng Si方案的统计数据。在文件中,每一个方案都应该在每一行中以下列形式表示出来:: 42993b51a10SYanteng Si 43093b51a10SYanteng Si <target access pattern> <action> <quota> <watermarks> 43193b51a10SYanteng Si 43293b51a10SYanteng Si你可以通过简单地在文件中写入一个空字符串来禁用方案。 43393b51a10SYanteng Si 43493b51a10SYanteng Si目标访问模式 43593b51a10SYanteng Si~~~~~~~~~~~~ 43693b51a10SYanteng Si 43793b51a10SYanteng Si``<目标访问模式>`` 是由三个范围构成的,形式如下:: 43893b51a10SYanteng Si 43993b51a10SYanteng Si min-size max-size min-acc max-acc min-age max-age 44093b51a10SYanteng Si 44193b51a10SYanteng Si具体来说,区域大小的字节数( `min-size` 和 `max-size` ),访问频率的每聚合区间的监测访问次 44293b51a10SYanteng Si数( `min-acc` 和 `max-acc` ),区域年龄的聚合区间数( `min-age` 和 `max-age` )都被指定。 44393b51a10SYanteng Si请注意,这些范围是封闭区间。 44493b51a10SYanteng Si 44593b51a10SYanteng Si动作 44693b51a10SYanteng Si~~~~ 44793b51a10SYanteng Si 44893b51a10SYanteng Si``<action>`` 是一个预定义的内存管理动作的整数,DAMON将应用于具有目标访问模式的区域。支持 44993b51a10SYanteng Si的数字和它们的含义如下:: 45093b51a10SYanteng Si 45193b51a10SYanteng Si - 0: Call ``madvise()`` for the region with ``MADV_WILLNEED`` 45293b51a10SYanteng Si - 1: Call ``madvise()`` for the region with ``MADV_COLD`` 45393b51a10SYanteng Si - 2: Call ``madvise()`` for the region with ``MADV_PAGEOUT`` 45493b51a10SYanteng Si - 3: Call ``madvise()`` for the region with ``MADV_HUGEPAGE`` 45593b51a10SYanteng Si - 4: Call ``madvise()`` for the region with ``MADV_NOHUGEPAGE`` 45693b51a10SYanteng Si - 5: Do nothing but count the statistics 45793b51a10SYanteng Si 45893b51a10SYanteng Si配额 45993b51a10SYanteng Si~~~~ 46093b51a10SYanteng Si 46193b51a10SYanteng Si每个 ``动作`` 的最佳 ``目标访问模式`` 取决于工作负载,所以不容易找到。更糟糕的是,将某个 46293b51a10SYanteng Si动作的方案设置得过于激进会导致严重的开销。为了避免这种开销,用户可以通过下面表格中的 ``<quota>`` 46393b51a10SYanteng Si来限制方案的时间和大小配额:: 46493b51a10SYanteng Si 46593b51a10SYanteng Si <ms> <sz> <reset interval> <priority weights> 46693b51a10SYanteng Si 46793b51a10SYanteng Si这使得DAMON在 ``<reset interval>`` 毫秒内,尽量只用 ``<ms>`` 毫秒的时间对 ``目标访 46893b51a10SYanteng Si问模式`` 的内存区域应用动作,并在 ``<reset interval>`` 内只对最多<sz>字节的内存区域应 46993b51a10SYanteng Si用动作。将 ``<ms>`` 和 ``<sz>`` 都设置为零,可以禁用配额限制。 47093b51a10SYanteng Si 47193b51a10SYanteng Si当预计超过配额限制时,DAMON会根据 ``目标访问模式`` 的大小、访问频率和年龄,对发现的内存 47293b51a10SYanteng Si区域进行优先排序。为了实现个性化的优先级,用户可以在 ``<优先级权重>`` 中设置这三个属性的 47393b51a10SYanteng Si权重,具体形式如下:: 47493b51a10SYanteng Si 47593b51a10SYanteng Si <size weight> <access frequency weight> <age weight> 47693b51a10SYanteng Si 47793b51a10SYanteng Si水位 47893b51a10SYanteng Si~~~~ 47993b51a10SYanteng Si 48093b51a10SYanteng Si有些方案需要根据系统特定指标的当前值来运行,如自由内存比率。对于这种情况,用户可以为该条 48193b51a10SYanteng Si件指定水位。:: 48293b51a10SYanteng Si 48393b51a10SYanteng Si <metric> <check interval> <high mark> <middle mark> <low mark> 48493b51a10SYanteng Si 48593b51a10SYanteng Si``<metric>`` 是一个预定义的整数,用于要检查的度量。支持的数字和它们的含义如下。 48693b51a10SYanteng Si 48793b51a10SYanteng Si - 0: 忽视水位 48893b51a10SYanteng Si - 1: 系统空闲内存率 (千分比) 48993b51a10SYanteng Si 49093b51a10SYanteng Si每隔 ``<检查间隔>`` 微秒检查一次公制的值。 49193b51a10SYanteng Si 49293b51a10SYanteng Si如果该值高于 ``<高标>`` 或低于 ``<低标>`` ,该方案被停用。如果该值低于 ``<中标>`` , 49393b51a10SYanteng Si该方案将被激活。 49493b51a10SYanteng Si 49593b51a10SYanteng Si统计数据 49693b51a10SYanteng Si~~~~~~~~ 49793b51a10SYanteng Si 49893b51a10SYanteng Si它还统计每个方案被尝试应用的区域的总数量和字节数,每个方案被成功应用的区域的两个数量,以 49993b51a10SYanteng Si及超过配额限制的总数量。这些统计数据可用于在线分析或调整方案。 50093b51a10SYanteng Si 50193b51a10SYanteng Si统计数据可以通过读取方案文件来显示。读取该文件将显示你在每一行中输入的每个 ``方案`` , 50293b51a10SYanteng Si统计的五个数字将被加在每一行的末尾。 50393b51a10SYanteng Si 50493b51a10SYanteng Si例子 50593b51a10SYanteng Si~~~~ 50693b51a10SYanteng Si 50793b51a10SYanteng Si下面的命令应用了一个方案:”如果一个大小为[4KiB, 8KiB]的内存区域在[10, 20]的聚合时间 50893b51a10SYanteng Si间隔内显示出每一个聚合时间间隔[0, 5]的访问量,请分页出该区域。对于分页,每秒最多只能使 50993b51a10SYanteng Si用10ms,而且每秒分页不能超过1GiB。在这一限制下,首先分页出具有较长年龄的内存区域。另外, 51093b51a10SYanteng Si每5秒钟检查一次系统的可用内存率,当可用内存率低于50%时开始监测和分页,但如果可用内存率 51193b51a10SYanteng Si大于60%,或低于30%,则停止监测“:: 51293b51a10SYanteng Si 51393b51a10SYanteng Si # cd <debugfs>/damon 51493b51a10SYanteng Si # scheme="4096 8192 0 5 10 20 2" # target access pattern and action 51593b51a10SYanteng Si # scheme+=" 10 $((1024*1024*1024)) 1000" # quotas 51693b51a10SYanteng Si # scheme+=" 0 0 100" # prioritization weights 51793b51a10SYanteng Si # scheme+=" 1 5000000 600 500 300" # watermarks 51893b51a10SYanteng Si # echo "$scheme" > schemes 51993b51a10SYanteng Si 52093b51a10SYanteng Si 52193b51a10SYanteng Si开关 52293b51a10SYanteng Si---- 52393b51a10SYanteng Si 52493b51a10SYanteng Si除非你明确地启动监测,否则如上所述的文件设置不会产生效果。你可以通过写入和读取 ``monitor_on`` 52593b51a10SYanteng Si文件来启动、停止和检查监测的当前状态。写入 ``on`` 该文件可以启动对有属性的目标的监测。写入 52693b51a10SYanteng Si``off`` 该文件则停止这些目标。如果每个目标进程被终止,DAMON也会停止。下面的示例命令开启、关 52793b51a10SYanteng Si闭和检查DAMON的状态:: 52893b51a10SYanteng Si 52993b51a10SYanteng Si # cd <debugfs>/damon 53093b51a10SYanteng Si # echo on > monitor_on 53193b51a10SYanteng Si # echo off > monitor_on 53293b51a10SYanteng Si # cat monitor_on 53393b51a10SYanteng Si off 53493b51a10SYanteng Si 53593b51a10SYanteng Si请注意,当监测开启时,你不能写到上述的debugfs文件。如果你在DAMON运行时写到这些文件,将会返 53693b51a10SYanteng Si回一个错误代码,如 ``-EBUSY`` 。 53793b51a10SYanteng Si 53893b51a10SYanteng Si 53993b51a10SYanteng Si监测线程PID 54093b51a10SYanteng Si----------- 54193b51a10SYanteng Si 54293b51a10SYanteng SiDAMON通过一个叫做kdamond的内核线程来进行请求监测。你可以通过读取 ``kdamond_pid`` 文件获 54393b51a10SYanteng Si得该线程的 ``pid`` 。当监测被 ``关闭`` 时,读取该文件不会返回任何信息:: 54493b51a10SYanteng Si 54593b51a10SYanteng Si # cd <debugfs>/damon 54693b51a10SYanteng Si # cat monitor_on 54793b51a10SYanteng Si off 54893b51a10SYanteng Si # cat kdamond_pid 54993b51a10SYanteng Si none 55093b51a10SYanteng Si # echo on > monitor_on 55193b51a10SYanteng Si # cat kdamond_pid 55293b51a10SYanteng Si 18594 55393b51a10SYanteng Si 55493b51a10SYanteng Si 55593b51a10SYanteng Si使用多个监测线程 55693b51a10SYanteng Si---------------- 55793b51a10SYanteng Si 55893b51a10SYanteng Si每个监测上下文都会创建一个 ``kdamond`` 线程。你可以使用 ``mk_contexts`` 和 ``rm_contexts`` 55993b51a10SYanteng Si文件为多个 ``kdamond`` 需要的用例创建和删除监测上下文。 56093b51a10SYanteng Si 56193b51a10SYanteng Si将新上下文的名称写入 ``mk_contexts`` 文件,在 ``DAMON debugfs`` 目录上创建一个该名称的目录。 56293b51a10SYanteng Si该目录将有该上下文的 ``DAMON debugfs`` 文件:: 56393b51a10SYanteng Si 56493b51a10SYanteng Si # cd <debugfs>/damon 56593b51a10SYanteng Si # ls foo 56693b51a10SYanteng Si # ls: cannot access 'foo': No such file or directory 56793b51a10SYanteng Si # echo foo > mk_contexts 56893b51a10SYanteng Si # ls foo 56993b51a10SYanteng Si # attrs init_regions kdamond_pid schemes target_ids 57093b51a10SYanteng Si 57193b51a10SYanteng Si如果不再需要上下文,你可以通过把上下文的名字放到 ``rm_contexts`` 文件中来删除它和相应的目录:: 57293b51a10SYanteng Si 57393b51a10SYanteng Si # echo foo > rm_contexts 57493b51a10SYanteng Si # ls foo 57593b51a10SYanteng Si # ls: cannot access 'foo': No such file or directory 57693b51a10SYanteng Si 57793b51a10SYanteng Si注意, ``mk_contexts`` 、 ``rm_contexts`` 和 ``monitor_on`` 文件只在根目录下。 57893b51a10SYanteng Si 57993b51a10SYanteng Si 58093b51a10SYanteng Si监测结果的监测点 58193b51a10SYanteng Si================ 58293b51a10SYanteng Si 58393b51a10SYanteng SiDAMON通过一个tracepoint ``damon:damon_aggregated`` 提供监测结果. 当监测开启时,你可 58493b51a10SYanteng Si以记录追踪点事件,并使用追踪点支持工具如perf显示结果。比如说:: 58593b51a10SYanteng Si 58693b51a10SYanteng Si # echo on > monitor_on 58793b51a10SYanteng Si # perf record -e damon:damon_aggregated & 58893b51a10SYanteng Si # sleep 5 58993b51a10SYanteng Si # kill 9 $(pidof perf) 59093b51a10SYanteng Si # echo off > monitor_on 59193b51a10SYanteng Si # perf script 592