?sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/mm/ksmmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/zh_TW/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/it_IT/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ja_JP/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ko_KR/mm/ksmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/sp_SP/mm/ksmmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhG/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/mm/ksm.rsthKubh field_body)}(hDocumentation/mm/ksm.rst h]h)}(hDocumentation/mm/ksm.rsth]hDocumentation/mm/ksm.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h$徐鑫 xu xin h]h)}(h#徐鑫 xu xin h](h徐鑫 xu xin <}(hjhhhNhNubh reference)}(hxu.xin16@zte.com.cnh]hxu.xin16@zte.com.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:xu.xin16@zte.com.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h内核同页合并h]h内核同页合并}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjFhhhhhK ubh)}(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内核。详见 }(hjYhhhNhNubhliteral)}(h ``mm/ksm.c``h]hmm/ksm.c}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jahjYubh5 的实现,以及http://lwn.net/Articles/306704和 }(hjYhhhNhNubj)}(hhttps://lwn.net/Articles/330589h]hhttps://lwn.net/Articles/330589}(hjuhhhNhNubah}(h]h ]h"]h$]h&]refurijwuh1jhjYubeh}(h]h ]h"]h$]h&]uh1hhhhK hjFhhubh)}(hkKSM的用户空间的接口在Documentation/translations/zh_CN/admin-guide/mm/ksm.rst 文档中有描述。h]hkKSM的用户空间的接口在Documentation/translations/zh_CN/admin-guide/mm/ksm.rst 文档中有描述。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubjE)}(hhh](jJ)}(h设计h]h设计}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubjE)}(hhh](jJ)}(h概述h]h概述}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(h9概述内容请见mm/ksm.c文档中的“DOC: Overview”h]h9概述内容请见mm/ksm.c文档中的“DOC: Overview”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id3ah ]h"]概述ah$]h&]uh1jDhjhhhhhKubjE)}(hhh](jJ)}(h 逆映射h]h 逆映射}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(h6KSM维护着稳定树中的KSM页的逆映射信息。h]h6KSM维护着稳定树中的KSM页的逆映射信息。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX当KSM页面的共享数小于 ``max_page_sharing`` 的虚拟内存区域(VMAs)时,则代表了 KSM页的稳定树其中的节点指向了一个ksm_rmap_item结构体类型的列表。同时,这个KSM页 的 ``page->mapping`` 指向了该稳定树节点。h](h当KSM页面的共享数小于 }(hjhhhNhNubjb)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jahjubh 的虚拟内存区域(VMAs)时,则代表了 KSM页的稳定树其中的节点指向了一个ksm_rmap_item结构体类型的列表。同时,这个KSM页 的 }(hjhhhNhNubjb)}(h``page->mapping``h]h page->mapping}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jahjubh 指向了该稳定树节点。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjhhubh)}(h如果共享数超过了阈值,KSM将给稳定树添加第二个维度。稳定树就变成链接一个或多 个稳定树"副本"的"链"。每个副本都保留KSM页的逆映射信息,其中 ``page->mapping`` 指向该"副本"。h](h如果共享数超过了阈值,KSM将给稳定树添加第二个维度。稳定树就变成链接一个或多 个稳定树”副本”的”链”。每个副本都保留KSM页的逆映射信息,其中 }(hj!hhhNhNubjb)}(h``page->mapping``h]h page->mapping}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jahj!ubh 指向该”副本”。}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK$hjhhubh)}(h每个链以及链接到该链中的所有"副本"强制不变的是,它们代表了相同的写保护内存 内容,尽管任中一个"副本"是由同一片内存区的不同的KSM复制页所指向的。h]h每个链以及链接到该链中的所有”副本”强制不变的是,它们代表了相同的写保护内存 内容,尽管任中一个”副本”是由同一片内存区的不同的KSM复制页所指向的。}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjhhubh)}(h这样一来,相比与无限的逆映射链表,稳定树的查找计算复杂性不受影响。但在稳定树 本身中不能有重复的KSM页面内容仍然是强制要求。h]h这样一来,相比与无限的逆映射链表,稳定树的查找计算复杂性不受影响。但在稳定树 本身中不能有重复的KSM页面内容仍然是强制要求。}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjhhubh)}(hX由 ``max_page_sharing`` 强制决定的数据去重限制是必要的,以此来避免虚拟内存 rmap链表变得过大。rmap的遍历具有O(N)的复杂度,其中N是共享页面的rmap_项(即 虚拟映射)的数量,而这个共享页面的节点数量又被 ``max_page_sharing`` 所限制。 因此,这有效地将线性O(N)计算复杂度从rmap遍历中分散到不同的KSM页面上。ksmd进 程在稳定节点"链"上的遍历也是O(N),但这个N是稳定树"副本"的数量,而不是rmap项 的数量,因此它对ksmd性能没有显著影响。实际上,最佳稳定树"副本"的候选节点将 保留在"副本"列表的开头。h](h由 }(hj]hhhNhNubjb)}(h``max_page_sharing``h]hmax_page_sharing}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jahj]ubh 强制决定的数据去重限制是必要的,以此来避免虚拟内存 rmap链表变得过大。rmap的遍历具有O(N)的复杂度,其中N是共享页面的rmap_项(即 虚拟映射)的数量,而这个共享页面的节点数量又被 }(hj]hhhNhNubjb)}(h``max_page_sharing``h]hmax_page_sharing}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jahj]ubhX 所限制。 因此,这有效地将线性O(N)计算复杂度从rmap遍历中分散到不同的KSM页面上。ksmd进 程在稳定节点”链”上的遍历也是O(N),但这个N是稳定树”副本”的数量,而不是rmap项 的数量,因此它对ksmd性能没有显著影响。实际上,最佳稳定树”副本”的候选节点将 保留在”副本”列表的开头。}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubh)}(hX0``max_page_sharing`` 的值设置得高了会促使更快的内存合并(因为将有更少的稳定 树副本排队进入稳定节点chain->hlist)和更高的数据去重系数,但代价是在交换、压 缩、NUMA平衡和页面迁移过程中可能导致KSM页的最大rmap遍历速度较慢。h](jb)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jahjubhX 的值设置得高了会促使更快的内存合并(因为将有更少的稳定 树副本排队进入稳定节点chain->hlist)和更高的数据去重系数,但代价是在交换、压 缩、NUMA平衡和页面迁移过程中可能导致KSM页的最大rmap遍历速度较慢。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK6hjhhubh)}(hX``stable_node_dups/stable_node_chains`` 的比值还受 ``max_page_sharing`` 调控 的影响,高比值可能意味着稳定节点dup中存在碎片,这可以通过在ksmd中引入碎片算 法来解决,该算法将rmap项从一个稳定节点dup重定位到另一个稳定节点dup,以便释放 那些仅包含极少rmap项的稳定节点"dup",但这可能会增加ksmd进程的CPU使用率,并可 能会减慢应用程序在KSM页面上的只读计算。h](jb)}(h'``stable_node_dups/stable_node_chains``h]h#stable_node_dups/stable_node_chains}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jahjubh 的比值还受 }(hjhhhNhNubjb)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jahjubhX 调控 的影响,高比值可能意味着稳定节点dup中存在碎片,这可以通过在ksmd中引入碎片算 法来解决,该算法将rmap项从一个稳定节点dup重定位到另一个稳定节点dup,以便释放 那些仅包含极少rmap项的稳定节点”dup”,但这可能会增加ksmd进程的CPU使用率,并可 能会减慢应用程序在KSM页面上的只读计算。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK:hjhhubh)}(hKSM会定期扫描稳定节点"链"中链接的所有稳定树"副本",以便删减过时了的稳定节点。 这种扫描的频率由 ``stable_node_chains_prune_millisecs`` 这个sysfs 接口定义。h](hKSM会定期扫描稳定节点”链”中链接的所有稳定树”副本”,以便删减过时了的稳定节点。 这种扫描的频率由 }(hjhhhNhNubjb)}(h&``stable_node_chains_prune_millisecs``h]h"stable_node_chains_prune_millisecs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jahjubh 这个sysfs 接口定义。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK@hjhhubeh}(h]id4ah ]h"] 逆映射ah$]h&]uh1jDhjhhhhhKubeh}(h]id2ah ]h"]设计ah$]h&]uh1jDhjFhhhhhKubjE)}(hhh](jJ)}(h参考h]h参考}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj hhhhhKDubh)}(h[内核代码请见mm/ksm.c。 涉及的函数(mm_slot ksm_scan stable_node rmap_item)。h]h[内核代码请见mm/ksm.c。 涉及的函数(mm_slot ksm_scan stable_node rmap_item)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhj hhubeh}(h]id5ah ]h"]参考ah$]h&]uh1jDhjFhhhhhKDubeh}(h]id1ah ]h"]内核同页合并ah$]h&]uh1jDhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jIN 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_handlerj[error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _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}(j5j2jjjjjjj-j*u nametypes}(j5jjjj-uh}(j2jFjjjjjjj*j u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jiKsRparse_messages]transform_messages] transformerN include_log]+Documentation/translations/zh_CN/mm/ksm.rst(NNNNta decorationNhhub.