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 (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/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 (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&]uh1hhhhS/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/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}(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 ubjE)}(hhh](jJ)}(h概述h]h概述}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjYhhhhhKubh)}(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内核。详见 }(hjjhhhNhNubhliteral)}(h ``mm/ksm.c``h]hmm/ksm.c}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjjubhT 的实现,以及http://lwn.net/Articles/306704 和https://lwn.net/Articles/330589}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubh)}(hX KSM最初目的是为了与KVM(即著名的内核共享内存)一起使用而开发的,通过共享虚拟机 之间的公共数据,将更多虚拟机放入物理内存。但它对于任何会生成多个相同数据实例的 应用程序都是很有用的。h]hX KSM最初目的是为了与KVM(即著名的内核共享内存)一起使用而开发的,通过共享虚拟机 之间的公共数据,将更多虚拟机放入物理内存。但它对于任何会生成多个相同数据实例的 应用程序都是很有用的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubh)}(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&]uh1hhhhKhjYhhubh)}(hX4KSM只合并匿名(私有)页面,从不合并页缓存(文件)页面。KSM的合并页面最初只能被 锁定在内核内存中,但现在可以就像其他用户页面一样被换出(但当它们被交换回来时共 享会被破坏: ksmd必须重新发现它们的身份并再次合并)。h]hX4KSM只合并匿名(私有)页面,从不合并页缓存(文件)页面。KSM的合并页面最初只能被 锁定在内核内存中,但现在可以就像其他用户页面一样被换出(但当它们被交换回来时共 享会被破坏: ksmd必须重新发现它们的身份并再次合并)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubeh}(h]id2ah ]h"]概述ah$]h&]uh1jDhjFhhhhhKubjE)}(hhh](jJ)}(h以madvise控制KSMh]h以madvise控制KSM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhK$ubh)}(hKSM仅在特定的地址空间区域时运行,即应用程序通过使用如下所示的madvise(2)系统调 用来请求某块地址成为可能的合并候选者的地址空间::h]hKSM仅在特定的地址空间区域时运行,即应用程序通过使用如下所示的madvise(2)系统调 用来请求某块地址成为可能的合并候选者的地址空间:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjhhubh literal_block)}(h)int madvise(addr, length, MADV_MERGEABLE)h]h)int madvise(addr, length, MADV_MERGEABLE)}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK)hjhhubh)}(h)应用程序当然也可以通过调用::h]h(应用程序当然也可以通过调用:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjhhubj)}(h+int madvise(addr, length, MADV_UNMERGEABLE)h]h+int madvise(addr, length, MADV_UNMERGEABLE)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK-hjhhubh)}(hX来取消该请求,并恢复为非共享页面:此时KSM将去除合并在该范围内的任何合并页。注意: 这个去除合并的调用可能突然需要的内存量超过实际可用的内存量-那么可能会出现EAGAIN 失败,但更可能会唤醒OOM killer。h]hX来取消该请求,并恢复为非共享页面:此时KSM将去除合并在该范围内的任何合并页。注意: 这个去除合并的调用可能突然需要的内存量超过实际可用的内存量-那么可能会出现EAGAIN 失败,但更可能会唤醒OOM killer。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/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&]uh1hhhhK3hjhhubh)}(hX如果一块内存区域必须被拆分为至少一个新的MADV_MERGEABLE区域或MADV_UNMERGEABLE区域, 当该进程将超过 ``vm.max_map_count`` 的设定,则madvise可能返回ENOMEM。(请参阅文档 Documentation/admin-guide/sysctl/vm.rst)。h](h如果一块内存区域必须被拆分为至少一个新的MADV_MERGEABLE区域或MADV_UNMERGEABLE区域, 当该进程将超过 }(hj;hhhNhNubjs)}(h``vm.max_map_count``h]hvm.max_map_count}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jrhj;ubhl 的设定,则madvise可能返回ENOMEM。(请参阅文档 Documentation/admin-guide/sysctl/vm.rst)。}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK9hjhhubh)}(hX与其他madvise调用一样,它们在用户地址空间的映射区域上使用:如果指定的范围包含未 映射的间隙(尽管在中间的映射区域工作),它们将报告ENOMEM,如果没有足够的内存用于 内部结构,则可能会因EAGAIN而失败。h]hX与其他madvise调用一样,它们在用户地址空间的映射区域上使用:如果指定的范围包含未 映射的间隙(尽管在中间的映射区域工作),它们将报告ENOMEM,如果没有足够的内存用于 内部结构,则可能会因EAGAIN而失败。}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubeh}(h] madviseksmah ]h"]以madvise控制ksmah$]h&]uh1jDhjFhhhhhK$ubjE)}(hhh](jJ)}(hKSM守护进程sysfs接口h]hKSM守护进程sysfs接口}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjqhhhhhKBubh)}(hKSM守护进程可以由``/sys/kernel/mm/ksm/`` 中的sysfs文件控制,所有人都可以读取,但 只能由root用户写入。各接口解释如下:h]hKSM守护进程可以由``/sys/kernel/mm/ksm/`` 中的sysfs文件控制,所有人都可以读取,但 只能由root用户写入。各接口解释如下:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjqhhubhdefinition_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&]uh1jhhhKLhjubh definition)}(hhh](h)}(hhksmd进程进入睡眠前要扫描的页数。 例如, ``echo 100 > /sys/kernel/mm/ksm/pages_to_scan``h](h9ksmd进程进入睡眠前要扫描的页数。 例如, }(hjhhhNhNubjs)}(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&]uh1jrhjubeh}(h]h ]h"]h$]h&]uh1hhhhKIhjubh)}(h6默认值:100(该值被选择用于演示目的)h]h6默认值:100(该值被选择用于演示目的)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKLhjubj)}(hsleep_millisecs ksmd在下次扫描前应休眠多少毫秒 例如, ``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs`` 默认值:20(该值被选择用于演示目的) h](j)}(hsleep_millisecsh]hsleep_millisecs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKRhjubj)}(hhh](h)}(hfksmd在下次扫描前应休眠多少毫秒 例如, ``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs``h](h6ksmd在下次扫描前应休眠多少毫秒 例如, }(hjhhhNhNubjs)}(h0``echo 20 > /sys/kernel/mm/ksm/sleep_millisecs``h]h,echo 20 > /sys/kernel/mm/ksm/sleep_millisecs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubeh}(h]h ]h"]h$]h&]uh1hhhhKOhjubh)}(h5默认值:20(该值被选择用于演示目的)h]h5默认值:20(该值被选择用于演示目的)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKRhjhhubj)}(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}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK^hj1ubj)}(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(默认设置)则可能会受 益于更大共享页面。在决定使用哪种设置之前,您可能希望比较系统在每种设置下 的性能。 }(hjFhhhNhNubjs)}(h``merge_across_nodes``h]hmerge_across_nodes}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjFubh 仅当系统中没有ksm共享页面时,才能被更改设 置:首先将接口`run` 设置为2从而对页进行去合并,然后在修改 }(hjFhhhNhNubjs)}(h``merge_across_nodes``h]hmerge_across_nodes}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjFubhG 后再将‘run’又设置为1,以根据新设置来重新合并。}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKUhjCubh)}(h@默认值:1(如早期的发布版本一样合并跨站点)h]h@默认值:1(如早期的发布版本一样合并跨站点)}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjCubeh}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhhhK^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&]uh1jhhhKfhjubj)}(hhh](h bullet_list)}(hhh](h list_item)}(h8设置为0可停止ksmd运行,但保留合并页面,h]h)}(hjh]h8设置为0可停止ksmd运行,但保留合并页面,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hK设置为1可运行ksmd,例如, ``echo 1 > /sys/kernel/mm/ksm/run`` ,h]h)}(hjh](h$设置为1可运行ksmd,例如, }(hjhhhNhNubjs)}(h#``echo 1 > /sys/kernel/mm/ksm/run``h]hecho 1 > /sys/kernel/mm/ksm/run}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh ,}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKbhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h设置为2可停止ksmd运行,并且对所有目前已合并的页进行去合并,但保留可合并 区域以供下次运行。 h]h)}(h设置为2可停止ksmd运行,并且对所有目前已合并的页进行去合并,但保留可合并 区域以供下次运行。h]h设置为2可停止ksmd运行,并且对所有目前已合并的页进行去合并,但保留可合并 区域以供下次运行。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKahjubh)}(hP默认值:0(必须设置为1才能激活KSM,除非禁用了CONFIG_SYSFS)h]hP默认值:0(必须设置为1才能激活KSM,除非禁用了CONFIG_SYSFS)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKfhjhhubj)}(hXouse_zero_pages 指定是否应当特殊处理空页(即那些仅含zero的已分配页)。当该值设置为1时, 空页与内核零页合并,而不是像通常情况下那样空页自身彼此合并。这可以根据 工作负载的不同,在具有着色零页的架构上可以提高性能。启用此设置时应小心, 因为它可能会降低某些工作负载的KSM性能,比如,当待合并的候选页面的校验和 与空页面的校验和恰好匹配的时候。此设置可随时更改,仅对那些更改后再合并 的页面有效。 默认值:0(如同早期版本的KSM正常表现) h](j)}(huse_zero_pagesh]huse_zero_pages}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKphj(ubj)}(hhh](h)}(hX&指定是否应当特殊处理空页(即那些仅含zero的已分配页)。当该值设置为1时, 空页与内核零页合并,而不是像通常情况下那样空页自身彼此合并。这可以根据 工作负载的不同,在具有着色零页的架构上可以提高性能。启用此设置时应小心, 因为它可能会降低某些工作负载的KSM性能,比如,当待合并的候选页面的校验和 与空页面的校验和恰好匹配的时候。此设置可随时更改,仅对那些更改后再合并 的页面有效。h]hX&指定是否应当特殊处理空页(即那些仅含zero的已分配页)。当该值设置为1时, 空页与内核零页合并,而不是像通常情况下那样空页自身彼此合并。这可以根据 工作负载的不同,在具有着色零页的架构上可以提高性能。启用此设置时应小心, 因为它可能会降低某些工作负载的KSM性能,比如,当待合并的候选页面的校验和 与空页面的校验和恰好匹配的时候。此设置可随时更改,仅对那些更改后再合并 的页面有效。}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihj:ubh)}(h7默认值:0(如同早期版本的KSM正常表现)h]h7默认值:0(如同早期版本的KSM正常表现)}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKphj:ubeh}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhhhKphjhhubj)}(hX)max_page_sharing 单个KSM页面允许的最大共享站点数。这将强制执行重复数据消除限制,以避免涉 及遍历共享KSM页面的虚拟映射的虚拟内存操作的高延迟。最小值为2,因为新创 建的KSM页面将至少有两个共享者。该值越高,KSM合并内存的速度越快,去重 因子也越高,但是对于任何给定的KSM页面,虚拟映射的最坏情况遍历的速度也会 越慢。减慢了这种遍历速度就意味着在交换、压缩、NUMA平衡和页面迁移期间, 某些虚拟内存操作将有更高的延迟,从而降低这些虚拟内存操作调用者的响应能力。 其他任务如果不涉及执行虚拟映射遍历的VM操作,其任务调度延迟不受此参数的影 响,因为这些遍历本身是调度友好的。 h](j)}(hmax_page_sharingh]hmax_page_sharing}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKzhjeubj)}(hhh]h)}(hX单个KSM页面允许的最大共享站点数。这将强制执行重复数据消除限制,以避免涉 及遍历共享KSM页面的虚拟映射的虚拟内存操作的高延迟。最小值为2,因为新创 建的KSM页面将至少有两个共享者。该值越高,KSM合并内存的速度越快,去重 因子也越高,但是对于任何给定的KSM页面,虚拟映射的最坏情况遍历的速度也会 越慢。减慢了这种遍历速度就意味着在交换、压缩、NUMA平衡和页面迁移期间, 某些虚拟内存操作将有更高的延迟,从而降低这些虚拟内存操作调用者的响应能力。 其他任务如果不涉及执行虚拟映射遍历的VM操作,其任务调度延迟不受此参数的影 响,因为这些遍历本身是调度友好的。h]hX单个KSM页面允许的最大共享站点数。这将强制执行重复数据消除限制,以避免涉 及遍历共享KSM页面的虚拟映射的虚拟内存操作的高延迟。最小值为2,因为新创 建的KSM页面将至少有两个共享者。该值越高,KSM合并内存的速度越快,去重 因子也越高,但是对于任何给定的KSM页面,虚拟映射的最坏情况遍历的速度也会 越慢。减慢了这种遍历速度就意味着在交换、压缩、NUMA平衡和页面迁移期间, 某些虚拟内存操作将有更高的延迟,从而降低这些虚拟内存操作调用者的响应能力。 其他任务如果不涉及执行虚拟映射遍历的VM操作,其任务调度延迟不受此参数的影 响,因为这些遍历本身是调度友好的。}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjwubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhhhKzhjhhubj)}(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&]uh1jhhhKhjubj)}(hhh]h)}(hXT指定KSM检查特定页面的元数据的频率(即那些达到过时信息数据去重限制标准的 页面)单位是毫秒。较小的毫秒值将以更低的延迟来释放KSM元数据,但它们将使 ksmd在扫描期间使用更多CPU。如果还没有一个KSM页面达到 ``max_page_sharing`` 标准,那就没有什么用。h](hX指定KSM检查特定页面的元数据的频率(即那些达到过时信息数据去重限制标准的 页面)单位是毫秒。较小的毫秒值将以更低的延迟来释放KSM元数据,但它们将使 ksmd在扫描期间使用更多CPU。如果还没有一个KSM页面达到 }(hjhhhNhNubjs)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh" 标准,那就没有什么用。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK}hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jhjqhhhhhNubh)}(h]KSM与MADV_MERGEABLE的工作有效性体现于 ``/sys/kernel/mm/ksm/`` 路径下的接口:h](h0KSM与MADV_MERGEABLE的工作有效性体现于 }(hjhhhNhNubjs)}(h``/sys/kernel/mm/ksm/``h]h/sys/kernel/mm/ksm/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 路径下的接口:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjqhhubj)}(hhh](j)}(h1pages_shared 表示多少共享页正在被使用h](j)}(h pages_sharedh]h pages_shared}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hhh]h)}(h$表示多少共享页正在被使用h]h$表示多少共享页正在被使用}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hVpages_sharing 表示还有多少站点正在共享这些共享页,即节省了多少h](j)}(h pages_sharingh]h pages_sharing}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj-ubj)}(hhh]h)}(hH表示还有多少站点正在共享这些共享页,即节省了多少h]hH表示还有多少站点正在共享这些共享页,即节省了多少}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj?ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(hQpages_unshared 表示有多少页是唯一的,但被反复检查以进行合并h](j)}(hpages_unsharedh]hpages_unshared}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj\ubj)}(hhh]h)}(hB表示有多少页是唯一的,但被反复检查以进行合并h]hB表示有多少页是唯一的,但被反复检查以进行合并}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjnubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(hFpages_volatile 表示有多少页因变化太快而无法放在tree中h](j)}(hpages_volatileh]hpages_volatile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hhh]h)}(h7表示有多少页因变化太快而无法放在tree中h]h7表示有多少页因变化太快而无法放在tree中}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(h8full_scans 表示所有可合并区域已扫描多少次h](j)}(h full_scansh]h full_scans}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hhh]h)}(h-表示所有可合并区域已扫描多少次h]h-表示所有可合并区域已扫描多少次}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(hAstable_node_chains 达到 ``max_page_sharing`` 限制的KSM页数h](j)}(hstable_node_chainsh]hstable_node_chains}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hhh]h)}(h.达到 ``max_page_sharing`` 限制的KSM页数h](h达到 }(hjhhhNhNubjs)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 限制的KSM页数}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(h$stable_node_dups 重复的KSM页数 h](j)}(hstable_node_dupsh]hstable_node_dups}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj*ubj)}(hhh]h)}(h重复的KSM页数h]h重复的KSM页数}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj<ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jhjqhhhhhNubh)}(h比值 ``pages_sharing/pages_shared`` 的最大值受限制于 ``max_page_sharing`` 的设定。要想增加该比值,则相应地要增加 ``max_page_sharing`` 的值。h](h比值 }(hj_hhhNhNubjs)}(h``pages_sharing/pages_shared``h]hpages_sharing/pages_shared}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jrhj_ubh 的最大值受限制于 }(hj_hhhNhNubjs)}(h``max_page_sharing``h]hmax_page_sharing}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhj_ubh; 的设定。要想增加该比值,则相应地要增加 }(hj_hhhNhNubjs)}(h``max_page_sharing``h]hmax_page_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhj_ubh 的值。}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjqhhubeh}(h]ksmsysfsah ]h"]ksm守护进程sysfs接口ah$]h&]uh1jDhjFhhhhhKBubjE)}(hhh](jJ)}(h监测KSM的收益h]h监测KSM的收益}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(hX6KSM可以通过合并相同的页面来节省内存,但也会消耗额外的内存,因为它需要生成一些rmap_items 来保存每个扫描页面的简要rmap信息。其中有些页面可能会被合并,但有些页面在被检查几次 后可能无法被合并,这些都是无益的内存消耗。h]hX6KSM可以通过合并相同的页面来节省内存,但也会消耗额外的内存,因为它需要生成一些rmap_items 来保存每个扫描页面的简要rmap信息。其中有些页面可能会被合并,但有些页面在被检查几次 后可能无法被合并,这些都是无益的内存消耗。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubhenumerated_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&]uh1hhhhKhjubj)}(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&]jjuh1jhhhKhjubh)}(h其中all_rmap_items可以通过对 ``pages_sharing`` 、 ``pages_shared`` 、 ``pages_unshared`` 和 ``pages_volatile`` 的求和而轻松获得。h](h$其中all_rmap_items可以通过对 }(hjhhhNhNubjs)}(h``pages_sharing``h]h pages_sharing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 、 }(hjhhhNhNubjs)}(h``pages_shared``h]h pages_shared}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 、 }hjsbjs)}(h``pages_unshared``h]hpages_unshared}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 和 }(hjhhhNhNubjs)}(h``pages_volatile``h]hpages_volatile}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 的求和而轻松获得。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(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的收益也可以通过以下近似的计算得到:}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjKubj)}(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).}hj]sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjKubh)}(hv其中ksm_merging_pages显示在 ``/proc//`` 目录下,而ksm_rmap_items 显示在 ``/proc//ksm_stat`` 。h](h!其中ksm_merging_pages显示在 }(hjkhhhNhNubjs)}(h``/proc//``h]h /proc//}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjkubh) 目录下,而ksm_rmap_items 显示在 }(hjkhhhNhNubjs)}(h``/proc//ksm_stat``h]h/proc//ksm_stat}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjkubh 。}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjKubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1jhjhhhhhKubh)}(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从应用的角度来看, }(hjhhhNhNubjs)}(h``ksm_rmap_items``h]hksm_rmap_items}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 和 }(hjhhhNhNubjs)}(h``ksm_merging_pages``h]hksm_merging_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubhX 的高比例意 味着不好的madvise-applied策略,所以开发者或管理员必须重新考虑如何改变madvis策 略。举个例子供参考,一个页面的大小通常是4K,而rmap_item的大小在32位CPU架构上分 别是32B,在64位CPU架构上是64B。所以如果 }(hjhhhNhNubjs)}(h$``ksm_rmap_items/ksm_merging_pages``h]h ksm_rmap_items/ksm_merging_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 的比例在64位CPU上超过64,或者在32位CPU上超过128,那么应用程序的madvise策略应 该被放弃,因为ksm收益大约为零或负值。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]ksmah ]h"]监测ksm的收益ah$]h&]uh1jDhjFhhhhhKubjE)}(hhh](jJ)}(h监控KSM事件h]h监控KSM事件}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(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) 的范围。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh](j)}(hcow_ksm 在每次KSM页面触发写时拷贝(COW)时都会被递增,当用户试图写入KSM页面时, 我们必须做一个拷贝。 h](j)}(hcow_ksmh]hcow_ksm}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hhh]h)}(h在每次KSM页面触发写时拷贝(COW)时都会被递增,当用户试图写入KSM页面时, 我们必须做一个拷贝。h]h在每次KSM页面触发写时拷贝(COW)时都会被递增,当用户试图写入KSM页面时, 我们必须做一个拷贝。}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj.ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(hksm_swpin_copy 在换入时,每次KSM页被复制时都会被递增。请注意,KSM页在换入时可能会被复 制,因为do_swap_page()不能做所有的锁,而需要重组一个跨anon_vma的KSM页。 h](j)}(hksm_swpin_copyh]hksm_swpin_copy}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjKubj)}(hhh]h)}(h在换入时,每次KSM页被复制时都会被递增。请注意,KSM页在换入时可能会被复 制,因为do_swap_page()不能做所有的锁,而需要重组一个跨anon_vma的KSM页。h]h在换入时,每次KSM页被复制时都会被递增。请注意,KSM页在换入时可能会被复 制,因为do_swap_page()不能做所有的锁,而需要重组一个跨anon_vma的KSM页。}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj]ubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubh)}(h1-- Izik Eidus, Hugh Dickins, 2009年11月17日。h]h1-- Izik Eidus, Hugh Dickins, 2009年11月17日。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id3ah ]h"]监控ksm事件ah$]h&]uh1jDhjFhhhhhKubeh}(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_handlerjerror_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}(jjjjjnjkjjjjjju nametypes}(jjjnjjjuh}(jjFjjYjkjjjqjjjju 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.}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj% ubah}(h]h ]h"]h$]h&]levelKtypeINFOlineKČsourcehuh1j# hjhhhhhKubatransform_messages] transformerN include_log]7Documentation/translations/zh_CN/admin-guide/mm/ksm.rst(NNNNta decorationNhhub.