Documentation/translations/zh_CN/mm/page_owner.rst
Source file repositories/reference/linux-study-clean/Documentation/translations/zh_CN/mm/page_owner.rst
File Facts
- System
- Linux kernel
- Corpus path
Documentation/translations/zh_CN/mm/page_owner.rst- Extension
.rst- Size
- 8433 bytes
- Lines
- 217
- Domain
- Support Tooling And Documentation
- Bucket
- Documentation
- Inferred role
- Support Tooling And Documentation: documentation
- Status
- atlas-only
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
- No C-style include directives detected by the generator.
Detected Declarations
- No top-level syscall, struct, function, initcall, or export declaration detected by the generator.
Annotated Snippet
:Original: Documentation/mm/page_owner.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
:校译:
================================
page owner: 跟踪谁分配的每个页面
================================
概述
====
page owner是用来追踪谁分配的每一个页面。它可以用来调试内存泄漏或找到内存占用者。
当分配发生时,有关分配的信息,如调用堆栈和页面的顺序被存储到每个页面的特定存储中。
当我们需要了解所有页面的状态时,我们可以获得并分析这些信息。
尽管我们已经有了追踪页面分配/释放的tracepoint,但用它来分析谁分配的每个页面是
相当复杂的。我们需要扩大跟踪缓冲区,以防止在用户空间程序启动前出现重叠。而且,启
动的程序会不断地将跟踪缓冲区转出,供以后分析,这将会改变系统的行为,会产生更多的
可能性,而不是仅仅保留在内存中,所以不利于调试。
页面所有者也可以用于各种目的。例如,可以通过每个页面的gfp标志信息获得精确的碎片
统计。如果启用了page owner,它就已经实现并激活了。我们非常欢迎其他用途。
它也可以用来显示所有的栈以及它们当前分配的基础页面数,这让我们能够快速了解内存的
使用情况,而无需浏览所有页面并匹配分配和释放操作。
page owner在默认情况下是禁用的。所以,如果你想使用它,你需要在你的启动cmdline
中加入"page_owner=on"。如果内核是用page owner构建的,并且由于没有启用启动
选项而在运行时禁用page owner,那么运行时的开销是很小的。如果在运行时禁用,它不
需要内存来存储所有者信息,所以没有运行时内存开销。而且,页面所有者在页面分配器的
热路径中只插入了两个不可能的分支,如果不启用,那么分配就会像没有页面所有者的内核
一样进行。这两个不可能的分支应该不会影响到分配的性能,特别是在静态键跳转标签修补
功能可用的情况下。以下是由于这个功能而导致的内核代码大小的变化。
尽管启用page owner会使内核的大小增加几千字节,但这些代码大部分都在页面分配器和
热路径之外。构建带有page owner的内核,并在需要时打开它,将是调试内核内存问题的
最佳选择。
有一个问题是由实现细节引起的。页所有者将信息存储到struct page扩展的内存中。这
个内存的初始化时间比稀疏内存系统中的页面分配器启动的时间要晚一些,所以,在初始化
之前,许多页面可以被分配,但它们没有所有者信息。为了解决这个问题,这些早期分配的
页面在初始化阶段被调查并标记为分配。虽然这并不意味着它们有正确的所有者信息,但至
少,我们可以更准确地判断该页是否被分配。在2GB内存的x86-64虚拟机上,有13343
个早期分配的页面被捕捉和标记,尽管它们大部分是由结构页扩展功能分配的。总之,在这
之后,没有任何页面处于未追踪状态。
使用方法
========
1) 构建用户空间的帮助::
cd tools/mm
make page_owner_sort
2) 启用page owner: 添加 "page_owner=on" 到 boot cmdline.
3) 做你想调试的工作。
4) 分析来自页面所有者的信息::
cat /sys/kernel/debug/page_owner_stacks/show_stacks > stacks.txt
cat stacks.txt
post_alloc_hook+0x177/0x1a0
get_page_from_freelist+0xd01/0xd80
__alloc_pages+0x39e/0x7e0
Annotation
- Atlas domain: Support Tooling And Documentation / Documentation.
- Implementation status: atlas-only.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.