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

Diff markup

Differences between /Documentation/translations/zh_TW/admin-guide/mm/ksm.rst (Architecture i386) and /Documentation/translations/zh_TW/admin-guide/mm/ksm.rst (Architecture m68k)


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