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

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_TW/admin-guide/mm/ksm.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 .. include:: ../../disclaimer-zh_TW.rst
  2 
  3 :Original: Documentation/admin-guide/mm/ksm.rst
  4 
  5 :翻譯:
  6 
  7   徐鑫 xu xin <xu.xin16@zte.com.cn>
  8 
  9 
 10 ============
 11 內核同頁合併
 12 ============
 13 
 14 
 15 概述
 16 ====
 17 
 18 KSM是一種能節省內存的數據去重功能,由CONFIG_KSM=y啓用,並在2.6.32版本時被添
 19 加到Linux內核。詳見 ``mm/ksm.c`` 的實現,以及http://lwn.net/Articles/306704
 20https://lwn.net/Articles/330589
 21 
 22 KSM最初目的是爲了與KVM(即著名的內核共享內存)一起使用而開發的,通過共享虛擬機
 23 之間的公共數據,將更多虛擬機放入物理內存。但它對於任何會生成多個相同數據實例的
 24 應用程序都是很有用的。
 25 
 26 KSM的守護進程ksmd會定期掃描那些已註冊的用戶內存區域,查找內容相同的頁面,這些
 27 頁面可以被單個寫保護頁面替換(如果進程以後想要更新其內容,將自動複製)。使用:
 28 引用:`sysfs intraface  <ksm_sysfs>` 接口來配置KSM守護程序在單個過程中所掃描的頁
 29 數以及兩個過程之間的間隔時間。
 30 
 31 KSM只合並匿名(私有)頁面,從不合並頁緩存(文件)頁面。KSM的合併頁面最初只能被
 32 鎖定在內核內存中,但現在可以就像其他用戶頁面一樣被換出(但當它們被交換回來時共
 33 享會被破壞: ksmd必須重新發現它們的身份並再次合併)。
 34 
 35 以madvise控制KSM
 36 ================
 37 
 38 KSM僅在特定的地址空間區域時運行,即應用程序通過使用如下所示的madvise(2)系統調
 39 用來請求某塊地址成爲可能的合併候選者的地址空間::
 40 
 41     int madvise(addr, length, MADV_MERGEABLE)
 42 
 43 應用程序當然也可以通過調用::
 44 
 45     int madvise(addr, length, MADV_UNMERGEABLE)
 46 
 47 來取消該請求,並恢復爲非共享頁面:此時KSM將去除合併在該範圍內的任何合併頁。注意:
 48 這個去除合併的調用可能突然需要的內存量超過實際可用的內存量-那麼可能會出現EAGAIN
 49 失敗,但更可能會喚醒OOM killer。
 50 
 51 如果KSM未被配置到正在運行的內核中,則madvise MADV_MERGEABLE 和 MADV_UNMERGEABLE
 52 的調用只會以EINVAL 失敗。如果正在運行的內核是用CONFIG_KSM=y方式構建的,那麼這些
 53 調用通常會成功:即使KSM守護程序當前沒有運行,MADV_MERGEABLE 仍然會在KSM守護程序
 54 啓動時註冊範圍,即使該範圍不能包含KSM實際可以合併的任何頁面,即使MADV_UNMERGEABLE
 55 應用於從未標記爲MADV_MERGEABLE的範圍。
 56 
 57 如果一塊內存區域必須被拆分爲至少一個新的MADV_MERGEABLE區域或MADV_UNMERGEABLE區域,
 58 當該進程將超過 ``vm.max_map_count`` 的設定,則madvise可能返回ENOMEM。(請參閱文檔
 59 Documentation/admin-guide/sysctl/vm.rst)。
 60 
 61 與其他madvise調用一樣,它們在用戶地址空間的映射區域上使用:如果指定的範圍包含未
 62 映射的間隙(儘管在中間的映射區域工作),它們將報告ENOMEM,如果沒有足夠的內存用於
 63 內部結構,則可能會因EAGAIN而失敗。
 64 
 65 KSM守護進程sysfs接口
 66 ====================
 67 
 68 KSM守護進程可以由``/sys/kernel/mm/ksm/`` 中的sysfs文件控制,所有人都可以讀取,但
 69 只能由root用戶寫入。各接口解釋如下:
 70 
 71 
 72 pages_to_scan
 73         ksmd進程進入睡眠前要掃描的頁數。
 74         例如, ``echo 100 > /sys/kernel/mm/ksm/pages_to_scan``
 75 
 76         默認值:100(該值被選擇用於演示目的)
 77 
 78 sleep_millisecs
 79         ksmd在下次掃描前應休眠多少毫秒
 80         例如, ``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs``
 81 
 82         默認值:20(該值被選擇用於演示目的)
 83 
 84 merge_across_nodes
 85         指定是否可以合併來自不同NUMA節點的頁面。當設置爲0時,ksm僅合併在物理上位
 86         於同一NUMA節點的內存區域中的頁面。這降低了訪問共享頁面的延遲。在有明顯的
 87         NUMA距離上,具有更多節點的系統可能受益於設置該值爲0時的更低延遲。而對於
 88         需要對內存使用量最小化的較小系統來說,設置該值爲1(默認設置)則可能會受
 89         益於更大共享頁面。在決定使用哪種設置之前,您可能希望比較系統在每種設置下
 90         的性能。 ``merge_across_nodes`` 僅當系統中沒有ksm共享頁面時,才能被更改設
 91         置:首先將接口`run` 設置爲2從而對頁進行去合併,然後在修改
 92         ``merge_across_nodes`` 後再將‘run’又設置爲1,以根據新設置來重新合併。
 93 
 94         默認值:1(如早期的發佈版本一樣合併跨站點)
 95 
 96 run
 97         * 設置爲0可停止ksmd運行,但保留合併頁面,
 98         * 設置爲1可運行ksmd,例如, ``echo 1 > /sys/kernel/mm/ksm/run`` ,
 99         * 設置爲2可停止ksmd運行,並且對所有目前已合併的頁進行去合併,但保留可合併
100           區域以供下次運行。
101 
102         默認值:0(必須設置爲1才能激活KSM,除非禁用了CONFIG_SYSFS)
103 
104 use_zero_pages
105         指定是否應當特殊處理空頁(即那些僅含zero的已分配頁)。當該值設置爲1時,
106         空頁與內核零頁合併,而不是像通常情況下那樣空頁自身彼此合併。這可以根據
107         工作負載的不同,在具有着色零頁的架構上可以提高性能。啓用此設置時應小心,
108         因爲它可能會降低某些工作負載的KSM性能,比如,當待合併的候選頁面的校驗和
109         與空頁面的校驗和恰好匹配的時候。此設置可隨時更改,僅對那些更改後再合併
110         的頁面有效。
111 
112         默認值:0(如同早期版本的KSM正常表現)
113 
114 max_page_sharing
115         單個KSM頁面允許的最大共享站點數。這將強制執行重複數據消除限制,以避免涉
116         及遍歷共享KSM頁面的虛擬映射的虛擬內存操作的高延遲。最小值爲2,因爲新創
117         建的KSM頁面將至少有兩個共享者。該值越高,KSM合併內存的速度越快,去重
118         因子也越高,但是對於任何給定的KSM頁面,虛擬映射的最壞情況遍歷的速度也會
119         越慢。減慢了這種遍歷速度就意味着在交換、壓縮、NUMA平衡和頁面遷移期間,
120         某些虛擬內存操作將有更高的延遲,從而降低這些虛擬內存操作調用者的響應能力。
121         其他任務如果不涉及執行虛擬映射遍歷的VM操作,其任務調度延遲不受此參數的影
122         響,因爲這些遍歷本身是調度友好的。
123 
124 stable_node_chains_prune_millisecs
125         指定KSM檢查特定頁面的元數據的頻率(即那些達到過時信息數據去重限制標準的
126         頁面)單位是毫秒。較小的毫秒值將以更低的延遲來釋放KSM元數據,但它們將使
127         ksmd在掃描期間使用更多CPU。如果還沒有一個KSM頁面達到 ``max_page_sharing``
128         標準,那就沒有什麼用。
129 
130 KSM與MADV_MERGEABLE的工作有效性體現於 ``/sys/kernel/mm/ksm/`` 路徑下的接口:
131 
132 pages_shared
133         表示多少共享頁正在被使用
134 pages_sharing
135         表示還有多少站點正在共享這些共享頁,即節省了多少
136 pages_unshared
137         表示有多少頁是唯一的,但被反覆檢查以進行合併
138 pages_volatile
139         表示有多少頁因變化太快而無法放在tree中
140 full_scans
141         表示所有可合併區域已掃描多少次
142 stable_node_chains
143         達到 ``max_page_sharing`` 限制的KSM頁數
144 stable_node_dups
145         重複的KSM頁數
146 
147 比值 ``pages_sharing/pages_shared`` 的最大值受限制於 ``max_page_sharing``
148 的設定。要想增加該比值,則相應地要增加 ``max_page_sharing`` 的值。
149 
150 監測KSM的收益
151 =============
152 
153 KSM可以通過合併相同的頁面來節省內存,但也會消耗額外的內存,因爲它需要生成一些rmap_items
154 來保存每個掃描頁面的簡要rmap信息。其中有些頁面可能會被合併,但有些頁面在被檢查幾次
155 後可能無法被合併,這些都是無益的內存消耗。
156 
157 1) 如何確定KSM在全系統範圍內是節省內存還是消耗內存?這裏有一個簡單的近似計算方法供參考::
158 
159        general_profit =~ pages_sharing * sizeof(page) - (all_rmap_items) *
160                          sizeof(rmap_item);
161 
162    其中all_rmap_items可以通過對 ``pages_sharing`` 、 ``pages_shared`` 、 ``pages_unshared``
163    和 ``pages_volatile`` 的求和而輕鬆獲得。
164 
165 2) 單一進程中KSM的收益也可以通過以下近似的計算得到::
166 
167        process_profit =~ ksm_merging_pages * sizeof(page) -
168                          ksm_rmap_items * sizeof(rmap_item).
169 
170    其中ksm_merging_pages顯示在 ``/proc/<pid>/`` 目錄下,而ksm_rmap_items
171    顯示在 ``/proc/<pid>/ksm_stat`` 。
172 
173 從應用的角度來看, ``ksm_rmap_items`` 和 ``ksm_merging_pages`` 的高比例意
174 味着不好的madvise-applied策略,所以開發者或管理員必須重新考慮如何改變madvis策
175 略。舉個例子供參考,一個頁面的大小通常是4K,而rmap_item的大小在32位CPU架構上分
176 別是32B,在64位CPU架構上是64B。所以如果 ``ksm_rmap_items/ksm_merging_pages``
177 的比例在64位CPU上超過64,或者在32位CPU上超過128,那麼應用程序的madvise策略應
178 該被放棄,因爲ksm收益大約爲零或負值。
179 
180 監控KSM事件
181 ===========
182 
183 在/proc/vmstat中有一些計數器,可以用來監控KSM事件。KSM可能有助於節省內存,這是
184 一種權衡,因爲它可能會在KSM COW或複製中的交換上遭受延遲。這些事件可以幫助用戶評估
185 是否或如何使用KSM。例如,如果cow_ksm增加得太快,用戶可以減少madvise(, , MADV_MERGEABLE)
186 的範圍。
187 
188 cow_ksm
189         在每次KSM頁面觸發寫時拷貝(COW)時都會被遞增,當用戶試圖寫入KSM頁面時,
190         我們必須做一個拷貝。
191 
192 ksm_swpin_copy
193         在換入時,每次KSM頁被複制時都會被遞增。請注意,KSM頁在換入時可能會被複
194         制,因爲do_swap_page()不能做所有的鎖,而需要重組一個跨anon_vma的KSM頁。
195 
196 --
197 Izik Eidus,
198 Hugh Dickins, 2009年11月17日。
199 

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