sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/admin-guide/mm/ksmmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Simplified)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_CN/admin-guide/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/admin-guide/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/admin-guide/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/admin-guide/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/admin-guide/mm/ksmmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Traditional)uh1h hh _documenthsourceNlineNubhwarning)}(hX1此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此, 如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或 修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。h]h paragraph)}(hX1此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此, 如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或 修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。h]hX1此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此, 如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或 修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_TW/disclaimer-zh_TW.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubhnote)}(h如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者, 或者發送電子郵件給胡皓文以獲取幫助:<2023002089@link.tyut.edu.cn>。h]h)}(h如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者, 或者發送電子郵件給胡皓文以獲取幫助:<2023002089@link.tyut.edu.cn>。h](h如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者, 或者發送電子郵件給胡皓文以獲取幫助:<}(hhhhhNhNubh reference)}(h2023002089@link.tyut.edu.cnh]h2023002089@link.tyut.edu.cn}(hhhhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:2023002089@link.tyut.edu.cnuh1hhhubh>。}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhS/var/lib/git/docbuild/linux/Documentation/translations/zh_TW/admin-guide/mm/ksm.rsthKubh field_body)}(h%Documentation/admin-guide/mm/ksm.rst h]h)}(h$Documentation/admin-guide/mm/ksm.rsth]h$Documentation/admin-guide/mm/ksm.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1j hhubeh}(h]h ]h"]h$]h&]uh1hhjhKhhhhubh)}(hhh](h)}(h翻譯h]h翻譯}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hjhKubj )}(h%徐鑫 xu xin h]h)}(h#徐鑫 xu xin h](h徐鑫 xu xin <}(hj>hhhNhNubh)}(hxu.xin16@zte.com.cnh]hxu.xin16@zte.com.cn}(hjFhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:xu.xin16@zte.com.cnuh1hhj>ubh>}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj:ubah}(h]h ]h"]h$]h&]uh1j hj)ubeh}(h]h ]h"]h$]h&]uh1hhjhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhjhKubhsection)}(hhh](htitle)}(h內核同頁合併h]h內核同頁合併}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jwhjthhhjhK ubjs)}(hhh](jx)}(h概述h]h概述}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jwhjhhhjhKubh)}(hKSM是一種能節省內存的數據去重功能,由CONFIG_KSM=y啓用,並在2.6.32版本時被添 加到Linux內核。詳見 ``mm/ksm.c`` 的實現,以及http://lwn.net/Articles/306704 和https://lwn.net/Articles/330589h](hKSM是一種能節省內存的數據去重功能,由CONFIG_KSM=y啓用,並在2.6.32版本時被添 加到Linux內核。詳見 }(hjhhhNhNubhliteral)}(h ``mm/ksm.c``h]hmm/ksm.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhT 的實現,以及http://lwn.net/Articles/306704 和https://lwn.net/Articles/330589}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubh)}(hX KSM最初目的是爲了與KVM(即著名的內核共享內存)一起使用而開發的,通過共享虛擬機 之間的公共數據,將更多虛擬機放入物理內存。但它對於任何會生成多個相同數據實例的 應用程序都是很有用的。h]hX KSM最初目的是爲了與KVM(即著名的內核共享內存)一起使用而開發的,通過共享虛擬機 之間的公共數據,將更多虛擬機放入物理內存。但它對於任何會生成多個相同數據實例的 應用程序都是很有用的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjhhubh)}(hXzKSM的守護進程ksmd會定期掃描那些已註冊的用戶內存區域,查找內容相同的頁面,這些 頁面可以被單個寫保護頁面替換(如果進程以後想要更新其內容,將自動複製)。使用: 引用:`sysfs intraface ` 接口來配置KSM守護程序在單個過程中所掃描的頁 數以及兩個過程之間的間隔時間。h](hKSM的守護進程ksmd會定期掃描那些已註冊的用戶內存區域,查找內容相同的頁面,這些 頁面可以被單個寫保護頁面替換(如果進程以後想要更新其內容,將自動複製)。使用: 引用:}(hjhhhNhNubhtitle_reference)}(h`sysfs intraface `h]hsysfs intraface }(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhn 接口來配置KSM守護程序在單個過程中所掃描的頁 數以及兩個過程之間的間隔時間。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubh)}(hX4KSM只合並匿名(私有)頁面,從不合並頁緩存(文件)頁面。KSM的合併頁面最初只能被 鎖定在內核內存中,但現在可以就像其他用戶頁面一樣被換出(但當它們被交換回來時共 享會被破壞: ksmd必須重新發現它們的身份並再次合併)。h]hX4KSM只合並匿名(私有)頁面,從不合並頁緩存(文件)頁面。KSM的合併頁面最初只能被 鎖定在內核內存中,但現在可以就像其他用戶頁面一樣被換出(但當它們被交換回來時共 享會被破壞: ksmd必須重新發現它們的身份並再次合併)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjhhubeh}(h]id2ah ]h"]概述ah$]h&]uh1jrhjthhhjhKubjs)}(hhh](jx)}(h以madvise控制KSMh]h以madvise控制KSM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jwhjhhhjhK$ubh)}(hKSM僅在特定的地址空間區域時運行,即應用程序通過使用如下所示的madvise(2)系統調 用來請求某塊地址成爲可能的合併候選者的地址空間::h]hKSM僅在特定的地址空間區域時運行,即應用程序通過使用如下所示的madvise(2)系統調 用來請求某塊地址成爲可能的合併候選者的地址空間:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK&hjhhubh literal_block)}(h)int madvise(addr, length, MADV_MERGEABLE)h]h)int madvise(addr, length, MADV_MERGEABLE)}hj!sbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhjhK)hjhhubh)}(h)應用程序當然也可以通過調用::h]h(應用程序當然也可以通過調用:}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK+hjhhubj )}(h+int madvise(addr, length, MADV_UNMERGEABLE)h]h+int madvise(addr, length, MADV_UNMERGEABLE)}hj?sbah}(h]h ]h"]h$]h&]j/j0uh1jhjhK-hjhhubh)}(hX來取消該請求,並恢復爲非共享頁面:此時KSM將去除合併在該範圍內的任何合併頁。注意: 這個去除合併的調用可能突然需要的內存量超過實際可用的內存量-那麼可能會出現EAGAIN 失敗,但更可能會喚醒OOM killer。h]hX來取消該請求,並恢復爲非共享頁面:此時KSM將去除合併在該範圍內的任何合併頁。注意: 這個去除合併的調用可能突然需要的內存量超過實際可用的內存量-那麼可能會出現EAGAIN 失敗,但更可能會喚醒OOM killer。}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK/hjhhubh)}(hX如果KSM未被配置到正在運行的內核中,則madvise MADV_MERGEABLE 和 MADV_UNMERGEABLE 的調用只會以EINVAL 失敗。如果正在運行的內核是用CONFIG_KSM=y方式構建的,那麼這些 調用通常會成功:即使KSM守護程序當前沒有運行,MADV_MERGEABLE 仍然會在KSM守護程序 啓動時註冊範圍,即使該範圍不能包含KSM實際可以合併的任何頁面,即使MADV_UNMERGEABLE 應用於從未標記爲MADV_MERGEABLE的範圍。h]hX如果KSM未被配置到正在運行的內核中,則madvise MADV_MERGEABLE 和 MADV_UNMERGEABLE 的調用只會以EINVAL 失敗。如果正在運行的內核是用CONFIG_KSM=y方式構建的,那麼這些 調用通常會成功:即使KSM守護程序當前沒有運行,MADV_MERGEABLE 仍然會在KSM守護程序 啓動時註冊範圍,即使該範圍不能包含KSM實際可以合併的任何頁面,即使MADV_UNMERGEABLE 應用於從未標記爲MADV_MERGEABLE的範圍。}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK3hjhhubh)}(hX如果一塊內存區域必須被拆分爲至少一個新的MADV_MERGEABLE區域或MADV_UNMERGEABLE區域, 當該進程將超過 ``vm.max_map_count`` 的設定,則madvise可能返回ENOMEM。(請參閱文檔 Documentation/admin-guide/sysctl/vm.rst)。h](h如果一塊內存區域必須被拆分爲至少一個新的MADV_MERGEABLE區域或MADV_UNMERGEABLE區域, 當該進程將超過 }(hjihhhNhNubj)}(h``vm.max_map_count``h]hvm.max_map_count}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubhl 的設定,則madvise可能返回ENOMEM。(請參閱文檔 Documentation/admin-guide/sysctl/vm.rst)。}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK9hjhhubh)}(hX與其他madvise調用一樣,它們在用戶地址空間的映射區域上使用:如果指定的範圍包含未 映射的間隙(儘管在中間的映射區域工作),它們將報告ENOMEM,如果沒有足夠的內存用於 內部結構,則可能會因EAGAIN而失敗。h]hX與其他madvise調用一樣,它們在用戶地址空間的映射區域上使用:如果指定的範圍包含未 映射的間隙(儘管在中間的映射區域工作),它們將報告ENOMEM,如果沒有足夠的內存用於 內部結構,則可能會因EAGAIN而失敗。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK=hjhhubeh}(h] madviseksmah ]h"]以madvise控制ksmah$]h&]uh1jrhjthhhjhK$ubjs)}(hhh](jx)}(hKSM守護進程sysfs接口h]hKSM守護進程sysfs接口}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jwhjhhhjhKBubh)}(hKSM守護進程可以由``/sys/kernel/mm/ksm/`` 中的sysfs文件控制,所有人都可以讀取,但 只能由root用戶寫入。各接口解釋如下:h]hKSM守護進程可以由``/sys/kernel/mm/ksm/`` 中的sysfs文件控制,所有人都可以讀取,但 只能由root用戶寫入。各接口解釋如下:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKDhjhhubhdefinition_list)}(hhh](hdefinition_list_item)}(hpages_to_scan ksmd進程進入睡眠前要掃描的頁數。 例如, ``echo 100 > /sys/kernel/mm/ksm/pages_to_scan`` 默認值:100(該值被選擇用於演示目的) h](hterm)}(h pages_to_scanh]h pages_to_scan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKLhjubh definition)}(hhh](h)}(hhksmd進程進入睡眠前要掃描的頁數。 例如, ``echo 100 > /sys/kernel/mm/ksm/pages_to_scan``h](h9ksmd進程進入睡眠前要掃描的頁數。 例如, }(hjhhhNhNubj)}(h/``echo 100 > /sys/kernel/mm/ksm/pages_to_scan``h]h+echo 100 > /sys/kernel/mm/ksm/pages_to_scan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhKIhjubh)}(h6默認值:100(該值被選擇用於演示目的)h]h6默認值:100(該值被選擇用於演示目的)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKLhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKLhjubj)}(hsleep_millisecs ksmd在下次掃描前應休眠多少毫秒 例如, ``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs`` 默認值:20(該值被選擇用於演示目的) h](j)}(hsleep_millisecsh]hsleep_millisecs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKRhjubj)}(hhh](h)}(hfksmd在下次掃描前應休眠多少毫秒 例如, ``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs``h](h6ksmd在下次掃描前應休眠多少毫秒 例如, }(hj)hhhNhNubj)}(h0``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs``h]h,echo 20 > /sys/kernel/mm/ksm/sleep_millisecs}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1hhjhKOhj&ubh)}(h5默認值:20(該值被選擇用於演示目的)h]h5默認值:20(該值被選擇用於演示目的)}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKRhj&ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKRhjhhubj)}(hX|merge_across_nodes 指定是否可以合併來自不同NUMA節點的頁面。當設置爲0時,ksm僅合併在物理上位 於同一NUMA節點的內存區域中的頁面。這降低了訪問共享頁面的延遲。在有明顯的 NUMA距離上,具有更多節點的系統可能受益於設置該值爲0時的更低延遲。而對於 需要對內存使用量最小化的較小系統來說,設置該值爲1(默認設置)則可能會受 益於更大共享頁面。在決定使用哪種設置之前,您可能希望比較系統在每種設置下 的性能。 ``merge_across_nodes`` 僅當系統中沒有ksm共享頁面時,才能被更改設 置:首先將接口`run` 設置爲2從而對頁進行去合併,然後在修改 ``merge_across_nodes`` 後再將‘run’又設置爲1,以根據新設置來重新合併。 默認值:1(如早期的發佈版本一樣合併跨站點) h](j)}(hmerge_across_nodesh]hmerge_across_nodes}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK^hj_ubj)}(hhh](h)}(hX&指定是否可以合併來自不同NUMA節點的頁面。當設置爲0時,ksm僅合併在物理上位 於同一NUMA節點的內存區域中的頁面。這降低了訪問共享頁面的延遲。在有明顯的 NUMA距離上,具有更多節點的系統可能受益於設置該值爲0時的更低延遲。而對於 需要對內存使用量最小化的較小系統來說,設置該值爲1(默認設置)則可能會受 益於更大共享頁面。在決定使用哪種設置之前,您可能希望比較系統在每種設置下 的性能。 ``merge_across_nodes`` 僅當系統中沒有ksm共享頁面時,才能被更改設 置:首先將接口`run` 設置爲2從而對頁進行去合併,然後在修改 ``merge_across_nodes`` 後再將‘run’又設置爲1,以根據新設置來重新合併。h](hX"指定是否可以合併來自不同NUMA節點的頁面。當設置爲0時,ksm僅合併在物理上位 於同一NUMA節點的內存區域中的頁面。這降低了訪問共享頁面的延遲。在有明顯的 NUMA距離上,具有更多節點的系統可能受益於設置該值爲0時的更低延遲。而對於 需要對內存使用量最小化的較小系統來說,設置該值爲1(默認設置)則可能會受 益於更大共享頁面。在決定使用哪種設置之前,您可能希望比較系統在每種設置下 的性能。 }(hjthhhNhNubj)}(h``merge_across_nodes``h]hmerge_across_nodes}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh 僅當系統中沒有ksm共享頁面時,才能被更改設 置:首先將接口`run` 設置爲2從而對頁進行去合併,然後在修改 }(hjthhhNhNubj)}(h``merge_across_nodes``h]hmerge_across_nodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubhG 後再將‘run’又設置爲1,以根據新設置來重新合併。}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKUhjqubh)}(h@默認值:1(如早期的發佈版本一樣合併跨站點)h]h@默認值:1(如早期的發佈版本一樣合併跨站點)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK^hjqubeh}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjhK^hjhhubj)}(hXhrun * 設置爲0可停止ksmd運行,但保留合併頁面, * 設置爲1可運行ksmd,例如, ``echo 1 > /sys/kernel/mm/ksm/run`` , * 設置爲2可停止ksmd運行,並且對所有目前已合併的頁進行去合併,但保留可合併 區域以供下次運行。 默認值:0(必須設置爲1才能激活KSM,除非禁用了CONFIG_SYSFS) h](j)}(hrunh]hrun}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKfhjubj)}(hhh](h bullet_list)}(hhh](h list_item)}(h8設置爲0可停止ksmd運行,但保留合併頁面,h]h)}(hjh]h8設置爲0可停止ksmd運行,但保留合併頁面,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKahjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hK設置爲1可運行ksmd,例如, ``echo 1 > /sys/kernel/mm/ksm/run`` ,h]h)}(hjh](h$設置爲1可運行ksmd,例如, }(hjhhhNhNubj)}(h#``echo 1 > /sys/kernel/mm/ksm/run``h]hecho 1 > /sys/kernel/mm/ksm/run}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ,}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKbhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h設置爲2可停止ksmd運行,並且對所有目前已合併的頁進行去合併,但保留可合併 區域以供下次運行。 h]h)}(h設置爲2可停止ksmd運行,並且對所有目前已合併的頁進行去合併,但保留可合併 區域以供下次運行。h]h設置爲2可停止ksmd運行,並且對所有目前已合併的頁進行去合併,但保留可合併 區域以供下次運行。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKchjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet*uh1jhjhKahjubh)}(hP默認值:0(必須設置爲1才能激活KSM,除非禁用了CONFIG_SYSFS)h]hP默認值:0(必須設置爲1才能激活KSM,除非禁用了CONFIG_SYSFS)}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKfhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKfhjhhubj)}(hXouse_zero_pages 指定是否應當特殊處理空頁(即那些僅含zero的已分配頁)。當該值設置爲1時, 空頁與內核零頁合併,而不是像通常情況下那樣空頁自身彼此合併。這可以根據 工作負載的不同,在具有着色零頁的架構上可以提高性能。啓用此設置時應小心, 因爲它可能會降低某些工作負載的KSM性能,比如,當待合併的候選頁面的校驗和 與空頁面的校驗和恰好匹配的時候。此設置可隨時更改,僅對那些更改後再合併 的頁面有效。 默認值:0(如同早期版本的KSM正常表現) h](j)}(huse_zero_pagesh]huse_zero_pages}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKphjVubj)}(hhh](h)}(hX&指定是否應當特殊處理空頁(即那些僅含zero的已分配頁)。當該值設置爲1時, 空頁與內核零頁合併,而不是像通常情況下那樣空頁自身彼此合併。這可以根據 工作負載的不同,在具有着色零頁的架構上可以提高性能。啓用此設置時應小心, 因爲它可能會降低某些工作負載的KSM性能,比如,當待合併的候選頁面的校驗和 與空頁面的校驗和恰好匹配的時候。此設置可隨時更改,僅對那些更改後再合併 的頁面有效。h]hX&指定是否應當特殊處理空頁(即那些僅含zero的已分配頁)。當該值設置爲1時, 空頁與內核零頁合併,而不是像通常情況下那樣空頁自身彼此合併。這可以根據 工作負載的不同,在具有着色零頁的架構上可以提高性能。啓用此設置時應小心, 因爲它可能會降低某些工作負載的KSM性能,比如,當待合併的候選頁面的校驗和 與空頁面的校驗和恰好匹配的時候。此設置可隨時更改,僅對那些更改後再合併 的頁面有效。}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKihjhubh)}(h7默認值:0(如同早期版本的KSM正常表現)h]h7默認值:0(如同早期版本的KSM正常表現)}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKphjhubeh}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjhKphjhhubj)}(hX)max_page_sharing 單個KSM頁面允許的最大共享站點數。這將強制執行重複數據消除限制,以避免涉 及遍歷共享KSM頁面的虛擬映射的虛擬內存操作的高延遲。最小值爲2,因爲新創 建的KSM頁面將至少有兩個共享者。該值越高,KSM合併內存的速度越快,去重 因子也越高,但是對於任何給定的KSM頁面,虛擬映射的最壞情況遍歷的速度也會 越慢。減慢了這種遍歷速度就意味着在交換、壓縮、NUMA平衡和頁面遷移期間, 某些虛擬內存操作將有更高的延遲,從而降低這些虛擬內存操作調用者的響應能力。 其他任務如果不涉及執行虛擬映射遍歷的VM操作,其任務調度延遲不受此參數的影 響,因爲這些遍歷本身是調度友好的。 h](j)}(hmax_page_sharingh]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKzhjubj)}(hhh]h)}(hX單個KSM頁面允許的最大共享站點數。這將強制執行重複數據消除限制,以避免涉 及遍歷共享KSM頁面的虛擬映射的虛擬內存操作的高延遲。最小值爲2,因爲新創 建的KSM頁面將至少有兩個共享者。該值越高,KSM合併內存的速度越快,去重 因子也越高,但是對於任何給定的KSM頁面,虛擬映射的最壞情況遍歷的速度也會 越慢。減慢了這種遍歷速度就意味着在交換、壓縮、NUMA平衡和頁面遷移期間, 某些虛擬內存操作將有更高的延遲,從而降低這些虛擬內存操作調用者的響應能力。 其他任務如果不涉及執行虛擬映射遍歷的VM操作,其任務調度延遲不受此參數的影 響,因爲這些遍歷本身是調度友好的。h]hX單個KSM頁面允許的最大共享站點數。這將強制執行重複數據消除限制,以避免涉 及遍歷共享KSM頁面的虛擬映射的虛擬內存操作的高延遲。最小值爲2,因爲新創 建的KSM頁面將至少有兩個共享者。該值越高,KSM合併內存的速度越快,去重 因子也越高,但是對於任何給定的KSM頁面,虛擬映射的最壞情況遍歷的速度也會 越慢。減慢了這種遍歷速度就意味着在交換、壓縮、NUMA平衡和頁面遷移期間, 某些虛擬內存操作將有更高的延遲,從而降低這些虛擬內存操作調用者的響應能力。 其他任務如果不涉及執行虛擬映射遍歷的VM操作,其任務調度延遲不受此參數的影 響,因爲這些遍歷本身是調度友好的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKshjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKzhjhhubj)}(hXxstable_node_chains_prune_millisecs 指定KSM檢查特定頁面的元數據的頻率(即那些達到過時信息數據去重限制標準的 頁面)單位是毫秒。較小的毫秒值將以更低的延遲來釋放KSM元數據,但它們將使 ksmd在掃描期間使用更多CPU。如果還沒有一個KSM頁面達到 ``max_page_sharing`` 標準,那就沒有什麼用。 h](j)}(h"stable_node_chains_prune_millisecsh]h"stable_node_chains_prune_millisecs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hhh]h)}(hXT指定KSM檢查特定頁面的元數據的頻率(即那些達到過時信息數據去重限制標準的 頁面)單位是毫秒。較小的毫秒值將以更低的延遲來釋放KSM元數據,但它們將使 ksmd在掃描期間使用更多CPU。如果還沒有一個KSM頁面達到 ``max_page_sharing`` 標準,那就沒有什麼用。h](hX指定KSM檢查特定頁面的元數據的頻率(即那些達到過時信息數據去重限制標準的 頁面)單位是毫秒。較小的毫秒值將以更低的延遲來釋放KSM元數據,但它們將使 ksmd在掃描期間使用更多CPU。如果還沒有一個KSM頁面達到 }(hjhhhNhNubj)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" 標準,那就沒有什麼用。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK}hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjhhubeh}(h]h ]h"]h$]h&]uh1jhjhhhjhNubh)}(h]KSM與MADV_MERGEABLE的工作有效性體現於 ``/sys/kernel/mm/ksm/`` 路徑下的接口:h](h0KSM與MADV_MERGEABLE的工作有效性體現於 }(hj hhhNhNubj)}(h``/sys/kernel/mm/ksm/``h]h/sys/kernel/mm/ksm/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 路徑下的接口:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubj)}(hhh](j)}(h1pages_shared 表示多少共享頁正在被使用h](j)}(h pages_sharedh]h pages_shared}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhj,ubj)}(hhh]h)}(h$表示多少共享頁正在被使用h]h$表示多少共享頁正在被使用}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj>ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)ubj)}(hVpages_sharing 表示還有多少站點正在共享這些共享頁,即節省了多少h](j)}(h pages_sharingh]h pages_sharing}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhj[ubj)}(hhh]h)}(hH表示還有多少站點正在共享這些共享頁,即節省了多少h]hH表示還有多少站點正在共享這些共享頁,即節省了多少}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjmubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)hhubj)}(hQpages_unshared 表示有多少頁是唯一的,但被反覆檢查以進行合併h](j)}(hpages_unsharedh]hpages_unshared}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hhh]h)}(hB表示有多少頁是唯一的,但被反覆檢查以進行合併h]hB表示有多少頁是唯一的,但被反覆檢查以進行合併}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)hhubj)}(hFpages_volatile 表示有多少頁因變化太快而無法放在tree中h](j)}(hpages_volatileh]hpages_volatile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hhh]h)}(h7表示有多少頁因變化太快而無法放在tree中h]h7表示有多少頁因變化太快而無法放在tree中}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)hhubj)}(h8full_scans 表示所有可合併區域已掃描多少次h](j)}(h full_scansh]h full_scans}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hhh]h)}(h-表示所有可合併區域已掃描多少次h]h-表示所有可合併區域已掃描多少次}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)hhubj)}(hAstable_node_chains 達到 ``max_page_sharing`` 限制的KSM頁數h](j)}(hstable_node_chainsh]hstable_node_chains}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hhh]h)}(h.達到 ``max_page_sharing`` 限制的KSM頁數h](h達到 }(hj,hhhNhNubj)}(h``max_page_sharing``h]hmax_page_sharing}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh 限制的KSM頁數}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj)ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)hhubj)}(h$stable_node_dups 重複的KSM頁數 h](j)}(hstable_node_dupsh]hstable_node_dups}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjXubj)}(hhh]h)}(h重複的KSM頁數h]h重複的KSM頁數}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjjubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjhKhj)hhubeh}(h]h ]h"]h$]h&]uh1jhjhhhjhNubh)}(h比值 ``pages_sharing/pages_shared`` 的最大值受限制於 ``max_page_sharing`` 的設定。要想增加該比值,則相應地要增加 ``max_page_sharing`` 的值。h](h比值 }(hjhhhNhNubj)}(h``pages_sharing/pages_shared``h]hpages_sharing/pages_shared}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的最大值受限制於 }(hjhhhNhNubj)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; 的設定。要想增加該比值,則相應地要增加 }(hjhhhNhNubj)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的值。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubeh}(h]ksmsysfsah ]h"]ksm守護進程sysfs接口ah$]h&]uh1jrhjthhhjhKBubjs)}(hhh](jx)}(h監測KSM的收益h]h監測KSM的收益}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jwhjhhhjhKubh)}(hX6KSM可以通過合併相同的頁面來節省內存,但也會消耗額外的內存,因爲它需要生成一些rmap_items 來保存每個掃描頁面的簡要rmap信息。其中有些頁面可能會被合併,但有些頁面在被檢查幾次 後可能無法被合併,這些都是無益的內存消耗。h]hX6KSM可以通過合併相同的頁面來節省內存,但也會消耗額外的內存,因爲它需要生成一些rmap_items 來保存每個掃描頁面的簡要rmap信息。其中有些頁面可能會被合併,但有些頁面在被檢查幾次 後可能無法被合併,這些都是無益的內存消耗。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjhhubhenumerated_list)}(hhh](j)}(hX如何確定KSM在全系統範圍內是節省內存還是消耗內存?這裏有一個簡單的近似計算方法供參考:: general_profit =~ pages_sharing * sizeof(page) - (all_rmap_items) * sizeof(rmap_item); 其中all_rmap_items可以通過對 ``pages_sharing`` 、 ``pages_shared`` 、 ``pages_unshared`` 和 ``pages_volatile`` 的求和而輕鬆獲得。 h](h)}(h}如何確定KSM在全系統範圍內是節省內存還是消耗內存?這裏有一個簡單的近似計算方法供參考::h]h|如何確定KSM在全系統範圍內是節省內存還是消耗內存?這裏有一個簡單的近似計算方法供參考:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubj )}(hhgeneral_profit =~ pages_sharing * sizeof(page) - (all_rmap_items) * sizeof(rmap_item);h]hhgeneral_profit =~ pages_sharing * sizeof(page) - (all_rmap_items) * sizeof(rmap_item);}hjsbah}(h]h ]h"]h$]h&]j/j0uh1jhjhKhjubh)}(h其中all_rmap_items可以通過對 ``pages_sharing`` 、 ``pages_shared`` 、 ``pages_unshared`` 和 ``pages_volatile`` 的求和而輕鬆獲得。h](h$其中all_rmap_items可以通過對 }(hjhhhNhNubj)}(h``pages_sharing``h]h pages_sharing}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 、 }(hjhhhNhNubj)}(h``pages_shared``h]h pages_shared}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 、 }hjsbj)}(h``pages_unshared``h]hpages_unshared}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h``pages_volatile``h]hpages_volatile}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的求和而輕鬆獲得。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjhhhjhNubj)}(hX4單一進程中KSM的收益也可以通過以下近似的計算得到:: process_profit =~ ksm_merging_pages * sizeof(page) - ksm_rmap_items * sizeof(rmap_item). 其中ksm_merging_pages顯示在 ``/proc//`` 目錄下,而ksm_rmap_items 顯示在 ``/proc//ksm_stat`` 。 h](h)}(hG單一進程中KSM的收益也可以通過以下近似的計算得到::h]hF單一進程中KSM的收益也可以通過以下近似的計算得到:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjyubj )}(hjprocess_profit =~ ksm_merging_pages * sizeof(page) - ksm_rmap_items * sizeof(rmap_item).h]hjprocess_profit =~ ksm_merging_pages * sizeof(page) - ksm_rmap_items * sizeof(rmap_item).}hjsbah}(h]h ]h"]h$]h&]j/j0uh1jhjhKhjyubh)}(hv其中ksm_merging_pages顯示在 ``/proc//`` 目錄下,而ksm_rmap_items 顯示在 ``/proc//ksm_stat`` 。h](h!其中ksm_merging_pages顯示在 }(hjhhhNhNubj)}(h``/proc//``h]h /proc//}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) 目錄下,而ksm_rmap_items 顯示在 }(hjhhhNhNubj)}(h``/proc//ksm_stat``h]h/proc//ksm_stat}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjyubeh}(h]h ]h"]h$]h&]uh1jhjhhhjhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1jhjhhhjhKubh)}(hX*從應用的角度來看, ``ksm_rmap_items`` 和 ``ksm_merging_pages`` 的高比例意 味着不好的madvise-applied策略,所以開發者或管理員必須重新考慮如何改變madvis策 略。舉個例子供參考,一個頁面的大小通常是4K,而rmap_item的大小在32位CPU架構上分 別是32B,在64位CPU架構上是64B。所以如果 ``ksm_rmap_items/ksm_merging_pages`` 的比例在64位CPU上超過64,或者在32位CPU上超過128,那麼應用程序的madvise策略應 該被放棄,因爲ksm收益大約爲零或負值。h](h從應用的角度來看, }(hjhhhNhNubj)}(h``ksm_rmap_items``h]hksm_rmap_items}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h``ksm_merging_pages``h]hksm_merging_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX 的高比例意 味着不好的madvise-applied策略,所以開發者或管理員必須重新考慮如何改變madvis策 略。舉個例子供參考,一個頁面的大小通常是4K,而rmap_item的大小在32位CPU架構上分 別是32B,在64位CPU架構上是64B。所以如果 }(hjhhhNhNubj)}(h$``ksm_rmap_items/ksm_merging_pages``h]h ksm_rmap_items/ksm_merging_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的比例在64位CPU上超過64,或者在32位CPU上超過128,那麼應用程序的madvise策略應 該被放棄,因爲ksm收益大約爲零或負值。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubeh}(h]ksmah ]h"]監測ksm的收益ah$]h&]uh1jrhjthhhjhKubjs)}(hhh](jx)}(h監控KSM事件h]h監控KSM事件}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jwhj(hhhjhKubh)}(hXa在/proc/vmstat中有一些計數器,可以用來監控KSM事件。KSM可能有助於節省內存,這是 一種權衡,因爲它可能會在KSM COW或複製中的交換上遭受延遲。這些事件可以幫助用戶評估 是否或如何使用KSM。例如,如果cow_ksm增加得太快,用戶可以減少madvise(, , MADV_MERGEABLE) 的範圍。h]hXa在/proc/vmstat中有一些計數器,可以用來監控KSM事件。KSM可能有助於節省內存,這是 一種權衡,因爲它可能會在KSM COW或複製中的交換上遭受延遲。這些事件可以幫助用戶評估 是否或如何使用KSM。例如,如果cow_ksm增加得太快,用戶可以減少madvise(, , MADV_MERGEABLE) 的範圍。}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj(hhubj)}(hhh](j)}(hcow_ksm 在每次KSM頁面觸發寫時拷貝(COW)時都會被遞增,當用戶試圖寫入KSM頁面時, 我們必須做一個拷貝。 h](j)}(hcow_ksmh]hcow_ksm}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjJubj)}(hhh]h)}(h在每次KSM頁面觸發寫時拷貝(COW)時都會被遞增,當用戶試圖寫入KSM頁面時, 我們必須做一個拷貝。h]h在每次KSM頁面觸發寫時拷貝(COW)時都會被遞增,當用戶試圖寫入KSM頁面時, 我們必須做一個拷貝。}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj\ubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjhKhjGubj)}(hksm_swpin_copy 在換入時,每次KSM頁被複制時都會被遞增。請注意,KSM頁在換入時可能會被複 制,因爲do_swap_page()不能做所有的鎖,而需要重組一個跨anon_vma的KSM頁。 h](j)}(hksm_swpin_copyh]hksm_swpin_copy}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjyubj)}(hhh]h)}(h在換入時,每次KSM頁被複制時都會被遞增。請注意,KSM頁在換入時可能會被複 制,因爲do_swap_page()不能做所有的鎖,而需要重組一個跨anon_vma的KSM頁。h]h在換入時,每次KSM頁被複制時都會被遞增。請注意,KSM頁在換入時可能會被複 制,因爲do_swap_page()不能做所有的鎖,而需要重組一個跨anon_vma的KSM頁。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjhKhjGhhubeh}(h]h ]h"]h$]h&]uh1jhj(hhhjhNubh)}(h1-- Izik Eidus, Hugh Dickins, 2009年11月17日。h]h1-- Izik Eidus, Hugh Dickins, 2009年11月17日。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj(hhubeh}(h]id3ah ]h"]監控ksm事件ah$]h&]uh1jrhjthhhjhKubeh}(h]id1ah ]h"]內核同頁合併ah$]h&]uh1jrhhhhhjhK ubeh}(h]h ]h"]h$]h&]sourcejuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jwN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcej _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjjjjjjj%j"jju nametypes}(jjjjj%juh}(jjtjjjjjjj"jjj(u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]hsystem_message)}(hhh]h)}(h`Possible incomplete section title. Treating the overline as ordinary text because it's so short.h]hbPossible incomplete section title. Treating the overline as ordinary text because it’s so short.}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS ubah}(h]h ]h"]h$]h&]levelKtypeINFOlineKČsourcejuh1jQ hj(hhhjhKubatransform_messages] transformerN include_log]7Documentation/translations/zh_TW/admin-guide/mm/ksm.rst(NNNNta decorationNhhub.