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

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_TW/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_TW.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
592 

~ [ 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