1f949cb75SHu Haowen.. SPDX-License-Identifier: GPL-2.0 2f949cb75SHu Haowen.. include:: ../../../disclaimer-zh_TW.rst 3f949cb75SHu Haowen 4f949cb75SHu Haowen:Original: Documentation/admin-guide/mm/damon/reclaim.rst 5f949cb75SHu Haowen 6f949cb75SHu Haowen:翻譯: 7f949cb75SHu Haowen 8f949cb75SHu Haowen 司延騰 Yanteng Si <siyanteng@loongson.cn> 9f949cb75SHu Haowen 10f949cb75SHu Haowen:校譯: 11f949cb75SHu Haowen 12f949cb75SHu Haowen=============== 13f949cb75SHu Haowen基於DAMON的回收 14f949cb75SHu Haowen=============== 15f949cb75SHu Haowen 16f949cb75SHu Haowen基於DAMON的回收(DAMON_RECLAIM)是一個靜態的內核模塊,旨在用於輕度內存壓力下的主動和輕 17f949cb75SHu Haowen量級的回收。它的目的不是取代基於LRU列表的頁面回收,而是有選擇地用於不同程度的內存壓力和要 18f949cb75SHu Haowen求。 19f949cb75SHu Haowen 20f949cb75SHu Haowen哪些地方需要主動回收? 21f949cb75SHu Haowen====================== 22f949cb75SHu Haowen 23f949cb75SHu Haowen在一般的內存超量使用(over-committed systems,虛擬化相關術語)的系統上,主動回收冷頁 24f949cb75SHu Haowen有助於節省內存和減少延遲高峯,這些延遲是由直接回收進程或kswapd的CPU消耗引起的,同時只產 25f949cb75SHu Haowen生最小的性能下降 [1]_ [2]_ 。 26f949cb75SHu Haowen 27f949cb75SHu Haowen基於空閒頁報告 [3]_ 的內存過度承諾的虛擬化系統就是很好的例子。在這樣的系統中,客戶機 28f949cb75SHu Haowen向主機報告他們的空閒內存,而主機則將報告的內存重新分配給其他客戶。因此,系統的內存得到了充 29f949cb75SHu Haowen分的利用。然而,客戶可能不那麼節省內存,主要是因爲一些內核子系統和用戶空間應用程序被設計爲 30f949cb75SHu Haowen使用盡可能多的內存。然後,客戶機可能只向主機報告少量的內存是空閒的,導致系統的內存利用率下降。 31f949cb75SHu Haowen在客戶中運行主動回收可以緩解這個問題。 32f949cb75SHu Haowen 33f949cb75SHu Haowen它是如何工作的? 34f949cb75SHu Haowen================ 35f949cb75SHu Haowen 36f949cb75SHu HaowenDAMON_RECLAIM找到在特定時間內沒有被訪問的內存區域並分頁。爲了避免它在分頁操作中消耗過多 37f949cb75SHu Haowen的CPU,可以配置一個速度限制。在這個速度限制下,它首先分頁出那些沒有被訪問過的內存區域。系 38f949cb75SHu Haowen統管理員還可以配置在什麼情況下這個方案應該自動激活和停用三個內存壓力水位。 39f949cb75SHu Haowen 40f949cb75SHu Haowen接口: 模塊參數 41f949cb75SHu Haowen============== 42f949cb75SHu Haowen 43f949cb75SHu Haowen要使用這個功能,你首先要確保你的系統運行在一個以 ``CONFIG_DAMON_RECLAIM=y`` 構建的內 44f949cb75SHu Haowen核上。 45f949cb75SHu Haowen 46f949cb75SHu Haowen爲了讓系統管理員啓用或禁用它,併爲給定的系統進行調整,DAMON_RECLAIM利用了模塊參數。也就 47f949cb75SHu Haowen是說,你可以把 ``damon_reclaim.<parameter>=<value>`` 放在內核啓動命令行上,或者把 48f949cb75SHu Haowen適當的值寫入 ``/sys/module/damon_reclaim/parameters/<parameter>`` 文件。 49f949cb75SHu Haowen 50f949cb75SHu Haowen下面是每個參數的描述。 51f949cb75SHu Haowen 52f949cb75SHu Haowenenabled 53f949cb75SHu Haowen------- 54f949cb75SHu Haowen 55f949cb75SHu Haowen啓用或禁用DAMON_RECLAIM。 56f949cb75SHu Haowen 57f949cb75SHu Haowen你可以通過把這個參數的值設置爲 ``Y`` 來啓用DAMON_RCLAIM,把它設置爲 ``N`` 可以禁用 58f949cb75SHu HaowenDAMON_RECLAIM。注意,由於基於水位的激活條件,DAMON_RECLAIM不能進行真正的監測和回收。 59f949cb75SHu Haowen這一點請參考下面關於水位參數的描述。 60f949cb75SHu Haowen 61f949cb75SHu Haowenmin_age 62f949cb75SHu Haowen------- 63f949cb75SHu Haowen 64f949cb75SHu Haowen識別冷內存區域的時間閾值,單位是微秒。 65f949cb75SHu Haowen 66f949cb75SHu Haowen如果一個內存區域在這個時間或更長的時間內沒有被訪問,DAMON_RECLAIM會將該區域識別爲冷的, 67f949cb75SHu Haowen並回收它。 68f949cb75SHu Haowen 69f949cb75SHu Haowen默認爲120秒。 70f949cb75SHu Haowen 71f949cb75SHu Haowenquota_ms 72f949cb75SHu Haowen-------- 73f949cb75SHu Haowen 74f949cb75SHu Haowen回收的時間限制,以毫秒爲單位。 75f949cb75SHu Haowen 76f949cb75SHu HaowenDAMON_RECLAIM 試圖在一個時間窗口(quota_reset_interval_ms)內只使用到這個時間,以 77f949cb75SHu Haowen嘗試回收冷頁。這可以用來限制DAMON_RECLAIM的CPU消耗。如果該值爲零,則該限制被禁用。 78f949cb75SHu Haowen 79f949cb75SHu Haowen默認爲10ms。 80f949cb75SHu Haowen 81f949cb75SHu Haowenquota_sz 82f949cb75SHu Haowen-------- 83f949cb75SHu Haowen 84f949cb75SHu Haowen回收的內存大小限制,單位爲字節。 85f949cb75SHu Haowen 86f949cb75SHu HaowenDAMON_RECLAIM 收取在一個時間窗口(quota_reset_interval_ms)內試圖回收的內存量,並 87f949cb75SHu Haowen使其不超過這個限制。這可以用來限制CPU和IO的消耗。如果該值爲零,則限制被禁用。 88f949cb75SHu Haowen 89f949cb75SHu Haowen默認情況下是128 MiB。 90f949cb75SHu Haowen 91f949cb75SHu Haowenquota_reset_interval_ms 92f949cb75SHu Haowen----------------------- 93f949cb75SHu Haowen 94f949cb75SHu Haowen時間/大小配額收取重置間隔,單位爲毫秒。 95f949cb75SHu Haowen 96f949cb75SHu Haowen時間(quota_ms)和大小(quota_sz)的配額的目標重置間隔。也就是說,DAMON_RECLAIM在 97f949cb75SHu Haowen嘗試回收‘不’超過quota_ms毫秒或quota_sz字節的內存。 98f949cb75SHu Haowen 99f949cb75SHu Haowen默認爲1秒。 100f949cb75SHu Haowen 101f949cb75SHu Haowenwmarks_interval 102f949cb75SHu Haowen--------------- 103f949cb75SHu Haowen 104f949cb75SHu Haowen當DAMON_RECLAIM被啓用但由於其水位規則而不活躍時,在檢查水位之前的最小等待時間。 105f949cb75SHu Haowen 106f949cb75SHu Haowenwmarks_high 107f949cb75SHu Haowen----------- 108f949cb75SHu Haowen 109f949cb75SHu Haowen高水位的可用內存率(每千字節)。 110f949cb75SHu Haowen 111f949cb75SHu Haowen如果系統的可用內存(以每千字節爲單位)高於這個數值,DAMON_RECLAIM就會變得不活躍,所以 112f949cb75SHu Haowen它什麼也不做,只是定期檢查水位。 113f949cb75SHu Haowen 114f949cb75SHu Haowenwmarks_mid 115f949cb75SHu Haowen---------- 116f949cb75SHu Haowen 117f949cb75SHu Haowen中間水位的可用內存率(每千字節)。 118f949cb75SHu Haowen 119f949cb75SHu Haowen如果系統的空閒內存(以每千字節爲單位)在這個和低水位線之間,DAMON_RECLAIM就會被激活, 120f949cb75SHu Haowen因此開始監測和回收。 121f949cb75SHu Haowen 122f949cb75SHu Haowenwmarks_low 123f949cb75SHu Haowen---------- 124f949cb75SHu Haowen 125f949cb75SHu Haowen低水位的可用內存率(每千字節)。 126f949cb75SHu Haowen 127f949cb75SHu Haowen如果系統的空閒內存(以每千字節爲單位)低於這個數值,DAMON_RECLAIM就會變得不活躍,所以 128f949cb75SHu Haowen它除了定期檢查水位外什麼都不做。在這種情況下,系統會退回到基於LRU列表的頁面粒度回收邏輯。 129f949cb75SHu Haowen 130f949cb75SHu Haowensample_interval 131f949cb75SHu Haowen--------------- 132f949cb75SHu Haowen 133f949cb75SHu Haowen監測的採樣間隔,單位是微秒。 134f949cb75SHu Haowen 135f949cb75SHu HaowenDAMON用於監測冷內存的採樣間隔。更多細節請參考DAMON文檔 (:doc:`usage`) 。 136f949cb75SHu Haowen 137f949cb75SHu Haowenaggr_interval 138f949cb75SHu Haowen------------- 139f949cb75SHu Haowen 140f949cb75SHu Haowen監測的聚集間隔,單位是微秒。 141f949cb75SHu Haowen 142f949cb75SHu HaowenDAMON對冷內存監測的聚集間隔。更多細節請參考DAMON文檔 (:doc:`usage`)。 143f949cb75SHu Haowen 144f949cb75SHu Haowenmin_nr_regions 145f949cb75SHu Haowen-------------- 146f949cb75SHu Haowen 147f949cb75SHu Haowen監測區域的最小數量。 148f949cb75SHu Haowen 149f949cb75SHu HaowenDAMON用於冷內存監測的最小監測區域數。這可以用來設置監測質量的下限。但是,設 150f949cb75SHu Haowen置的太高可能會導致監測開銷的增加。更多細節請參考DAMON文檔 (:doc:`usage`) 。 151f949cb75SHu Haowen 152f949cb75SHu Haowenmax_nr_regions 153f949cb75SHu Haowen-------------- 154f949cb75SHu Haowen 155f949cb75SHu Haowen監測區域的最大數量。 156f949cb75SHu Haowen 157f949cb75SHu HaowenDAMON用於冷內存監測的最大監測區域數。這可以用來設置監測開銷的上限值。但是, 158f949cb75SHu Haowen設置得太低可能會導致監測質量不好。更多細節請參考DAMON文檔 (:doc:`usage`) 。 159f949cb75SHu Haowen 160f949cb75SHu Haowenmonitor_region_start 161f949cb75SHu Haowen-------------------- 162f949cb75SHu Haowen 163f949cb75SHu Haowen目標內存區域的物理地址起點。 164f949cb75SHu Haowen 165f949cb75SHu HaowenDAMON_RECLAIM將對其進行工作的內存區域的起始物理地址。也就是說,DAMON_RECLAIM 166f949cb75SHu Haowen將在這個區域中找到冷的內存區域並進行回收。默認情況下,該區域使用最大系統內存區。 167f949cb75SHu Haowen 168f949cb75SHu Haowenmonitor_region_end 169f949cb75SHu Haowen------------------ 170f949cb75SHu Haowen 171f949cb75SHu Haowen目標內存區域的結束物理地址。 172f949cb75SHu Haowen 173f949cb75SHu HaowenDAMON_RECLAIM將對其進行工作的內存區域的末端物理地址。也就是說,DAMON_RECLAIM將 174f949cb75SHu Haowen在這個區域內找到冷的內存區域並進行回收。默認情況下,該區域使用最大系統內存區。 175f949cb75SHu Haowen 176f949cb75SHu Haowenkdamond_pid 177f949cb75SHu Haowen----------- 178f949cb75SHu Haowen 179f949cb75SHu HaowenDAMON線程的PID。 180f949cb75SHu Haowen 181f949cb75SHu Haowen如果DAMON_RECLAIM被啓用,這將成爲工作線程的PID。否則,爲-1。 182f949cb75SHu Haowen 183f949cb75SHu Haowennr_reclaim_tried_regions 184f949cb75SHu Haowen------------------------ 185f949cb75SHu Haowen 186f949cb75SHu Haowen試圖通過DAMON_RECLAIM回收的內存區域的數量。 187f949cb75SHu Haowen 188f949cb75SHu Haowenbytes_reclaim_tried_regions 189f949cb75SHu Haowen--------------------------- 190f949cb75SHu Haowen 191f949cb75SHu Haowen試圖通過DAMON_RECLAIM回收的內存區域的總字節數。 192f949cb75SHu Haowen 193f949cb75SHu Haowennr_reclaimed_regions 194f949cb75SHu Haowen-------------------- 195f949cb75SHu Haowen 196f949cb75SHu Haowen通過DAMON_RECLAIM成功回收的內存區域的數量。 197f949cb75SHu Haowen 198f949cb75SHu Haowenbytes_reclaimed_regions 199f949cb75SHu Haowen----------------------- 200f949cb75SHu Haowen 201f949cb75SHu Haowen通過DAMON_RECLAIM成功回收的內存區域的總字節數。 202f949cb75SHu Haowen 203f949cb75SHu Haowennr_quota_exceeds 204f949cb75SHu Haowen---------------- 205f949cb75SHu Haowen 206f949cb75SHu Haowen超過時間/空間配額限制的次數。 207f949cb75SHu Haowen 208f949cb75SHu Haowen例子 209f949cb75SHu Haowen==== 210f949cb75SHu Haowen 211f949cb75SHu Haowen下面的運行示例命令使DAMON_RECLAIM找到30秒或更長時間沒有訪問的內存區域並“回收”? 212f949cb75SHu Haowen爲了避免DAMON_RECLAIM在分頁操作中消耗過多的CPU時間,回收被限制在每秒1GiB以內。 213f949cb75SHu Haowen它還要求DAMON_RECLAIM在系統的可用內存率超過50%時不做任何事情,但如果它低於40%時 214f949cb75SHu Haowen就開始真正的工作。如果DAMON_RECLAIM沒有取得進展,因此空閒內存率低於20%,它會要求 215f949cb75SHu HaowenDAMON_RECLAIM再次什麼都不做,這樣我們就可以退回到基於LRU列表的頁面粒度回收了:: 216f949cb75SHu Haowen 217f949cb75SHu Haowen # cd /sys/module/damon_reclaim/parameters 218f949cb75SHu Haowen # echo 30000000 > min_age 219f949cb75SHu Haowen # echo $((1 * 1024 * 1024 * 1024)) > quota_sz 220f949cb75SHu Haowen # echo 1000 > quota_reset_interval_ms 221f949cb75SHu Haowen # echo 500 > wmarks_high 222f949cb75SHu Haowen # echo 400 > wmarks_mid 223f949cb75SHu Haowen # echo 200 > wmarks_low 224f949cb75SHu Haowen # echo Y > enabled 225f949cb75SHu Haowen 226f949cb75SHu Haowen.. [1] https://research.google/pubs/pub48551/ 227f949cb75SHu Haowen.. [2] https://lwn.net/Articles/787611/ 228f949cb75SHu Haowen.. [3] https://www.kernel.org/doc/html/latest/mm/free_page_reporting.html 229f949cb75SHu Haowen 230