:Dsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/mm/overcommit-accountingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/zh_TW/mm/overcommit-accountingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/it_IT/mm/overcommit-accountingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ja_JP/mm/overcommit-accountingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ko_KR/mm/overcommit-accountingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/sp_SP/mm/overcommit-accountingmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h超量使用审计h]h超量使用审计}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhY/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/mm/overcommit-accounting.rsthK ubh paragraph)}(h/Linux内核支持下列超量使用处理模式h]h/Linux内核支持下列超量使用处理模式}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhdefinition_list)}(hhh](hdefinition_list_item)}(h0 启发式超量使用处理。拒绝明显的地址空间超量使用。用于一个典型的系统。 它确保严重的疯狂分配失败,同时允许超量使用以减少swap的使用。这是默认的。h](hterm)}(h0h]h0}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubh definition)}(hhh]h)}(h启发式超量使用处理。拒绝明显的地址空间超量使用。用于一个典型的系统。 它确保严重的疯狂分配失败,同时允许超量使用以减少swap的使用。这是默认的。h]h启发式超量使用处理。拒绝明显的地址空间超量使用。用于一个典型的系统。 它确保严重的疯狂分配失败,同时允许超量使用以减少swap的使用。这是默认的。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhubh)}(h1 总是超量使用。适用于一些科学应用。经典的例子是使用稀疏数组的代码,只是依赖 几乎完全由零页组成的虚拟内存 h](h)}(h1h]h1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hhh]h)}(h总是超量使用。适用于一些科学应用。经典的例子是使用稀疏数组的代码,只是依赖 几乎完全由零页组成的虚拟内存h]h总是超量使用。适用于一些科学应用。经典的例子是使用稀疏数组的代码,只是依赖 几乎完全由零页组成的虚拟内存}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX2 不超量使用。系统提交的总地址空间不允许超过swap+一个可配置的物理RAM的数量 (默认为50%)。根据你使用的数量,在大多数情况下,这意味着一个进程在访问页面时 不会被杀死,但会在内存分配上收到相应的错误。 对于那些想保证他们的内存分配在未来可用而又不需要初始化每一个页面的应用程序来说 是很有用的。 h](h)}(h2h]h2}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0ubh)}(hhh](h)}(hX不超量使用。系统提交的总地址空间不允许超过swap+一个可配置的物理RAM的数量 (默认为50%)。根据你使用的数量,在大多数情况下,这意味着一个进程在访问页面时 不会被杀死,但会在内存分配上收到相应的错误。h]hX不超量使用。系统提交的总地址空间不允许超过swap+一个可配置的物理RAM的数量 (默认为50%)。根据你使用的数量,在大多数情况下,这意味着一个进程在访问页面时 不会被杀死,但会在内存分配上收到相应的错误。}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjBubh)}(h对于那些想保证他们的内存分配在未来可用而又不需要初始化每一个页面的应用程序来说 是很有用的。h]h对于那些想保证他们的内存分配在未来可用而又不需要初始化每一个页面的应用程序来说 是很有用的。}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjBubeh}(h]h ]h"]h$]h&]uh1hhj0ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hF超量使用策略是通过sysctl `vm.overcommit_memory` 设置的。h](h#超量使用策略是通过sysctl }(hjshhhNhNubhtitle_reference)}(h`vm.overcommit_memory`h]hvm.overcommit_memory}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjsubh 设置的。}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(h可以通过 `vm.overcommit_ratio` (百分比)或 `vm.overcommit_kbytes` (绝对值) 来设置超限数量。这些只有在 `vm.overcommit_memory` 被设置为2时才有效果。h](h 可以通过 }(hjhhhNhNubj|)}(h`vm.overcommit_ratio`h]hvm.overcommit_ratio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjubh (百分比)或 }(hjhhhNhNubj|)}(h`vm.overcommit_kbytes`h]hvm.overcommit_kbytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjubh9 (绝对值) 来设置超限数量。这些只有在 }(hjhhhNhNubj|)}(h`vm.overcommit_memory`h]hvm.overcommit_memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjubh 被设置为2时才有效果。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK"hhhhubh)}(hv在 ``/proc/meminfo`` 中可以分别以CommitLimit和Committed_AS的形式查看当前 的超量使用和提交量。h](h在 }(hjhhhNhNubhliteral)}(h``/proc/meminfo``h]h /proc/meminfo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubha 中可以分别以CommitLimit和Committed_AS的形式查看当前 的超量使用和提交量。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK%hhhhubh)}(hhh](h)}(h陷阱h]h陷阱}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK)ubh)}(hXHC语言的堆栈增长是一个隐含的mremap。如果你想得到绝对的保证,并在接近边缘的地方运行, 你 **必须** 为你认为你需要的最大尺寸的堆栈进行mmap。对于典型的堆栈使用来说,这并 不重要,但如果你真的非常关心的话,这就是一个值得关注的案例。h](h~C语言的堆栈增长是一个隐含的mremap。如果你想得到绝对的保证,并在接近边缘的地方运行, 你 }(hj hhhNhNubhstrong)}(h **必须**h]h必须}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 为你认为你需要的最大尺寸的堆栈进行mmap。对于典型的堆栈使用来说,这并 不重要,但如果你真的非常关心的话,这就是一个值得关注的案例。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hjhhubh)}(h/在模式2中,MAP_NORESERVE标志被忽略。h]h/在模式2中,MAP_NORESERVE标志被忽略。}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubeh}(h]id2ah ]h"]陷阱ah$]h&]uh1hhhhhhhhK)ubh)}(hhh](h)}(h它是如何工作的h]h它是如何工作的}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhhhhhK4ubh)}(h!超量使用是基于以下规则h]h!超量使用是基于以下规则}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjDhhubh)}(hhh](h)}(h对于文件映射 | SHARED or READ-only - 0 cost (该文件是映射而不是交换) | PRIVATE WRITABLE - 每个实例的映射大小 h](h)}(h对于文件映射h]h对于文件映射}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjfubh)}(hhh]h line_block)}(hhh](hh)}(hHSHARED or READ-only - 0 cost (该文件是映射而不是交换)h]hHSHARED or READ-only - 0 cost (该文件是映射而不是交换)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hindentKhj}hhhKubj)}(h9PRIVATE WRITABLE - 每个实例的映射大小h]h9PRIVATE WRITABLE - 每个实例的映射大小}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hjKhj}hhhKubeh}(h]h ]h"]h$]h&]uh1j{hjxubah}(h]h ]h"]h$]h&]uh1hhjfubeh}(h]h ]h"]h$]h&]uh1hhhhK:hjcubh)}(h对于匿名或者 ``/dev/zero`` 映射 | SHARED - 映射的大小 | PRIVATE READ-only - 0 cost (但作用不大) | PRIVATE WRITABLE - 每个实例的映射大小 h](h)}(h'对于匿名或者 ``/dev/zero`` 映射h](h对于匿名或者 }(hjhhhNhNubj)}(h ``/dev/zero``h]h /dev/zero}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 映射}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK?hjubh)}(hhh]j|)}(hhh](j)}(h5SHARED - 映射的大小h]h5SHARED - 映射的大小}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hjKhjhhhKubj)}(h6PRIVATE READ-only - 0 cost (但作用不大)h]h6PRIVATE READ-only - 0 cost (但作用不大)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hjKhjhhhKubj)}(h9PRIVATE WRITABLE - 每个实例的映射大小h]h9PRIVATE WRITABLE - 每个实例的映射大小}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hjKhjhhhKubeh}(h]h ]h"]h$]h&]uh1j{hjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK?hjchhubh)}(h^额外的计数 | 通过mmap制作可写副本的页面 | 从同一池中提取的shmfs内存 h](h)}(h额外的计数h]h额外的计数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChjubh)}(hhh]j|)}(hhh](j)}(h%通过mmap制作可写副本的页面h]h%通过mmap制作可写副本的页面}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hjKhj+hhhKubj)}(h#从同一池中提取的shmfs内存h]h#从同一池中提取的shmfs内存}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hjKhj+hhhKubeh}(h]h ]h"]h$]h&]uh1j{hj(ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKChjchhubeh}(h]h ]h"]h$]h&]uh1hhjDhhhhhNubeh}(h]id3ah ]h"]它是如何工作的ah$]h&]uh1hhhhhhhhK4ubh)}(hhh](h)}(h状态h]h状态}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhhhhhKFubh bullet_list)}(hhh](h list_item)}(h我们核算mmap内存映射h]h)}(hjh]h我们核算mmap内存映射}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h)我们核算mprotect在提交中的变化h]h)}(hjh]h)我们核算mprotect在提交中的变化}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h!我们核算mremap的大小变化h]h)}(hjh]h!我们核算mremap的大小变化}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h我们的审计 brkh]h)}(hjh]h我们的审计 brk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h 审计munmaph]h)}(hjh]h 审计munmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h$我们在/proc中报告commit 状态h]h)}(hjh]h$我们在/proc中报告commit 状态}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h核对并检查分叉的情况h]h)}(hjh]h核对并检查分叉的情况}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhj ubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h%审查堆栈处理/执行中的构建h]h)}(hj%h]h%审查堆栈处理/执行中的构建}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhj#ubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h叙述SHMfs的情况h]h)}(hj<h]h叙述SHMfs的情况}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhj:ubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubj)}(h实现实际限制的执行 h]h)}(h实现实际限制的执行h]h实现实际限制的执行}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjQubah}(h]h ]h"]h$]h&]uh1jhj}hhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1j{hhhKHhjjhhubeh}(h]id4ah ]h"]状态ah$]h&]uh1hhhhhhhhKFubh)}(hhh](h)}(h待续h]h待续}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhhhhhKTubj|)}(hhh]j)}(h"ptrace 页计数(这很难)。h]h)}(hjh]h"ptrace 页计数(这很难)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]jojpuh1j{hhhKUhjyhhubeh}(h]id5ah ]h"]待续ah$]h&]uh1hhhhhhhhKTubeh}(h]id1ah ]h"]超量使用审计ah$]h&]uh1hhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN 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}(jjjAj>jgjdjvjsjju nametypes}(jjAjgjvjuh}(jhj>jjdjDjsjjjjyu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.