~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/mm/page_owner.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/translations/zh_CN/mm/page_owner.rst (Architecture i386) and /Documentation/translations/zh_CN/mm/page_owner.rst (Architecture sparc64)


  1 :Original: Documentation/mm/page_owner.rst          1 :Original: Documentation/mm/page_owner.rst
  2                                                     2 
  3 :翻译:                                            3 :翻译:
  4                                                     4 
  5  司延腾 Yanteng Si <siyanteng@loongson.cn>        5  司延腾 Yanteng Si <siyanteng@loongson.cn>
  6                                                     6 
  7 :校译:                                            7 :校译:
  8                                                     8 
  9                                                     9 
 10 ================================                   10 ================================
 11 page owner: 跟踪谁分配的每个页面         11 page owner: 跟踪谁分配的每个页面
 12 ================================                   12 ================================
 13                                                    13 
 14 概述                                             14 概述
 15 ====                                               15 ====
 16                                                    16 
 17 page owner是用来追踪谁分配的每一个     17 page owner是用来追踪谁分配的每一个页面。它可以用来调试内存泄漏或找到内存占用者。
 18 当分配发生时,有关分配的信息,     18 当分配发生时,有关分配的信息,如调用堆栈和页面的顺序被存储到每个页面的特定存储中。
 19 当我们需要了解所有页面的状态时     19 当我们需要了解所有页面的状态时,我们可以获得并分析这些信息。
 20                                                    20 
 21 尽管我们已经有了追踪页面分配/释     21 尽管我们已经有了追踪页面分配/释放的tracepoint,但用它来分析谁分配的每个页面是
 22 相当复杂的。我们需要扩大跟踪缓     22 相当复杂的。我们需要扩大跟踪缓冲区,以防止在用户空间程序启动前出现重叠。而且,启
 23 动的程序会不断地将跟踪缓冲区转     23 动的程序会不断地将跟踪缓冲区转出,供以后分析,这将会改变系统的行为,会产生更多的
 24 可能性,而不是仅仅保留在内存中     24 可能性,而不是仅仅保留在内存中,所以不利于调试。
 25                                                    25 
 26 页面所有者也可以用于各种目的。     26 页面所有者也可以用于各种目的。例如,可以通过每个页面的gfp标志信息获得精确的碎片
 27 统计。如果启用了page owner,它就已     27 统计。如果启用了page owner,它就已经实现并激活了。我们非常欢迎其他用途。
 28                                                    28 
 29 page owner在默认情况下是禁用的。所     29 page owner在默认情况下是禁用的。所以,如果你想使用它,你需要在你的启动cmdline
 30 中加入"page_owner=on"。如果内核是用p     30 中加入"page_owner=on"。如果内核是用page owner构建的,并且由于没有启用启动
 31 选项而在运行时禁用page owner,那么     31 选项而在运行时禁用page owner,那么运行时的开销是很小的。如果在运行时禁用,它不
 32 需要内存来存储所有者信息,所以     32 需要内存来存储所有者信息,所以没有运行时内存开销。而且,页面所有者在页面分配器的
 33 热路径中只插入了两个不可能的分     33 热路径中只插入了两个不可能的分支,如果不启用,那么分配就会像没有页面所有者的内核
 34 一样进行。这两个不可能的分支应     34 一样进行。这两个不可能的分支应该不会影响到分配的性能,特别是在静态键跳转标签修补
 35 功能可用的情况下。以下是由于这     35 功能可用的情况下。以下是由于这个功能而导致的内核代码大小的变化。
 36                                                    36 
 37 尽管启用page owner会使内核的大小增     37 尽管启用page owner会使内核的大小增加几千字节,但这些代码大部分都在页面分配器和
 38 热路径之外。构建带有page owner的内     38 热路径之外。构建带有page owner的内核,并在需要时打开它,将是调试内核内存问题的
 39 最佳选择。                                    39 最佳选择。
 40                                                    40 
 41 有一个问题是由实现细节引起的。     41 有一个问题是由实现细节引起的。页所有者将信息存储到struct page扩展的内存中。这
 42 个内存的初始化时间比稀疏内存系     42 个内存的初始化时间比稀疏内存系统中的页面分配器启动的时间要晚一些,所以,在初始化
 43 之前,许多页面可以被分配,但它     43 之前,许多页面可以被分配,但它们没有所有者信息。为了解决这个问题,这些早期分配的
 44 页面在初始化阶段被调查并标记为     44 页面在初始化阶段被调查并标记为分配。虽然这并不意味着它们有正确的所有者信息,但至
 45 少,我们可以更准确地判断该页是     45 少,我们可以更准确地判断该页是否被分配。在2GB内存的x86-64虚拟机上,有13343
 46 个早期分配的页面被捕捉和标记,     46 个早期分配的页面被捕捉和标记,尽管它们大部分是由结构页扩展功能分配的。总之,在这
 47 之后,没有任何页面处于未追踪状     47 之后,没有任何页面处于未追踪状态。
 48                                                    48 
 49 使用方法                                       49 使用方法
 50 ========                                           50 ========
 51                                                    51 
 52 1) 构建用户空间的帮助::                   52 1) 构建用户空间的帮助::
 53                                                    53 
 54         cd tools/mm                                54         cd tools/mm
 55         make page_owner_sort                       55         make page_owner_sort
 56                                                    56 
 57 2) 启用page owner: 添加 "page_owner=on"      57 2) 启用page owner: 添加 "page_owner=on" 到 boot cmdline.
 58                                                    58 
 59 3) 做你想调试的工作。                     59 3) 做你想调试的工作。
 60                                                    60 
 61 4) 分析来自页面所有者的信息::          61 4) 分析来自页面所有者的信息::
 62                                                    62 
 63         cat /sys/kernel/debug/page_owner > pag     63         cat /sys/kernel/debug/page_owner > page_owner_full.txt
 64         ./page_owner_sort page_owner_full.txt      64         ./page_owner_sort page_owner_full.txt sorted_page_owner.txt
 65                                                    65 
 66    ``page_owner_full.txt`` 的一般输出情     66    ``page_owner_full.txt`` 的一般输出情况如下::
 67                                                    67 
 68         Page allocated via order XXX, ...          68         Page allocated via order XXX, ...
 69         PFN XXX ...                                69         PFN XXX ...
 70         // 栈详情                               70         // 栈详情
 71                                                    71 
 72         Page allocated via order XXX, ...          72         Page allocated via order XXX, ...
 73         PFN XXX ...                                73         PFN XXX ...
 74         // 栈详情                               74         // 栈详情
 75     默认情况下,它将以一个给定的     75     默认情况下,它将以一个给定的pfn开始,做完整的pfn转储,且page_owner支持fseek。
 76                                                    76 
 77     FILE *fp = fopen("/sys/kernel/debug/page_o     77     FILE *fp = fopen("/sys/kernel/debug/page_owner", "r");
 78     fseek(fp, pfn_start, SEEK_SET);                78     fseek(fp, pfn_start, SEEK_SET);
 79                                                    79 
 80    ``page_owner_sort`` 工具忽略了 ``PFN``     80    ``page_owner_sort`` 工具忽略了 ``PFN`` 行,将剩余的行放在buf中,使用regexp提
 81    取页序值,计算buf的次数和页数     81    取页序值,计算buf的次数和页数,最后根据参数进行排序。
 82                                                    82 
 83    在 ``sorted_page_owner.txt`` 中可以看     83    在 ``sorted_page_owner.txt`` 中可以看到关于谁分配了每个页面的结果。一般输出::
 84                                                    84 
 85         XXX times, XXX pages:                      85         XXX times, XXX pages:
 86         Page allocated via order XXX, ...          86         Page allocated via order XXX, ...
 87         // Detailed stack                          87         // Detailed stack
 88                                                    88 
 89    默认情况下, ``page_owner_sort`` 是     89    默认情况下, ``page_owner_sort`` 是根据buf的时间来排序的。如果你想
 90    按buf的页数排序,请使用-m参数     90    按buf的页数排序,请使用-m参数。详细的参数是:
 91                                                    91 
 92    基本函数::                                  92    基本函数::
 93                                                    93 
 94         排序:                                    94         排序:
 95                 -a              按内存分     95                 -a              按内存分配时间排序
 96                 -m              按总内存     96                 -m              按总内存排序
 97                 -p              按pid排序     97                 -p              按pid排序。
 98                 -P              按tgid排序     98                 -P              按tgid排序。
 99                 -n              按任务命     99                 -n              按任务命令名称排序。
100                 -r              按内存释    100                 -r              按内存释放时间排序。
101                 -s              按堆栈跟    101                 -s              按堆栈跟踪排序。
102                 -t              按时间排    102                 -t              按时间排序(默认)。
103        --sort <order> 指定排序顺序。排    103        --sort <order> 指定排序顺序。排序的语法是[+|-]key[,[+|-]key[,...]]。从
104        **标准格式指定器**那一节选    104        **标准格式指定器**那一节选择一个键。"+"是可选的,因为默认的方向是数字或
105        词法的增加。允许混合使用缩    105        词法的增加。允许混合使用缩写和完整格式的键。
106                                                   106 
107         例子:                                   107         例子:
108                                 ./page_owner_s    108                                 ./page_owner_sort <input> <output> --sort=n,+pid,-tgid
109                                 ./page_owner_s    109                                 ./page_owner_sort <input> <output> --sort=at
110                                                   110 
111     其它函数::                                111     其它函数::
112                                                   112 
113         剔除:                                   113         剔除:
114                 --cull <rules>                    114                 --cull <rules>
115                         指定剔除规则。    115                         指定剔除规则。剔除的语法是key[,key[,...]]。从**标准格式指定器**
116                                 部分选择    116                                 部分选择一个多字母键。
117                 <rules>是一个以逗号分    117                 <rules>是一个以逗号分隔的列表形式的单一参数,它提供了一种指定单个剔除规则的
118                 方法。 识别的关键字    118                 方法。 识别的关键字在下面的**标准格式指定器**部分有描述。<规则>可以通过键的
119                 序列k1,k2,...来指定,在    119                 序列k1,k2,...来指定,在下面的标准排序键部分有描述。允许混合使用简写和完整形
120                 式的键。                      120                 式的键。
121                                                   121 
122                 Examples:                         122                 Examples:
123                                 ./page_owner_s    123                                 ./page_owner_sort <input> <output> --cull=stacktrace
124                                 ./page_owner_s    124                                 ./page_owner_sort <input> <output> --cull=st,pid,name
125                                 ./page_owner_s    125                                 ./page_owner_sort <input> <output> --cull=n,f
126                                                   126 
127         过滤:                                   127         过滤:
128                 -f              过滤掉内    128                 -f              过滤掉内存已被释放的块的信息。
129                                                   129 
130         选择:                                   130         选择:
131                 --pid <pidlist>         按pid    131                 --pid <pidlist>         按pid选择。这将选择进程ID号出现在<pidlist>中的块。
132                 --tgid <tgidlist>       按tgi    132                 --tgid <tgidlist>       按tgid选择。这将选择其线程组ID号出现在<tgidlist>
133                                     中的块    133                                     中的块。
134                 --name <cmdlist>        按任    134                 --name <cmdlist>        按任务命令名称选择。这将选择其任务命令名称出现在
135                                     <cmdlist>    135                                     <cmdlist>中的区块。
136                                                   136 
137                 <pidlist>, <tgidlist>, <cmdlis    137                 <pidlist>, <tgidlist>, <cmdlist>是以逗号分隔的列表形式的单个参数,
138                 它提供了一种指定单个    138                 它提供了一种指定单个选择规则的方法。
139                                                   139 
140                                                   140 
141                 例子:                           141                 例子:
142                                 ./page_owner_s    142                                 ./page_owner_sort <input> <output> --pid=1
143                                 ./page_owner_s    143                                 ./page_owner_sort <input> <output> --tgid=1,2,3
144                                 ./page_owner_s    144                                 ./page_owner_sort <input> <output> --name name1,name2
145                                                   145 
146 标准格式指定器                             146 标准格式指定器
147 ==============                                    147 ==============
148 ::                                                148 ::
149                                                   149 
150   --sort的选项:                                150   --sort的选项:
151                                                   151 
152         短键          长键          描述    152         短键          长键          描述
153         p               pid             进程    153         p               pid             进程ID
154         tg              tgid            线程    154         tg              tgid            线程组ID
155         n               name            任务    155         n               name            任务命令名称
156         st              stacktrace      页面    156         st              stacktrace      页面分配的堆栈跟踪
157         T               txt             块的    157         T               txt             块的全文
158         ft              free_ts         页面    158         ft              free_ts         页面释放时的时间戳
159         at              alloc_ts        页面    159         at              alloc_ts        页面被分配时的时间戳
160         ator            allocator       页面    160         ator            allocator       页面的内存分配器
161                                                   161 
162   --curl的选项:                                162   --curl的选项:
163                                                   163 
164         短键          长键          描述    164         短键          长键          描述
165         p               pid             进程    165         p               pid             进程ID
166         tg              tgid            线程    166         tg              tgid            线程组ID
167         n               name            任务    167         n               name            任务命令名称
168         f               free            该页    168         f               free            该页是否已经释放
169         st              stacktrace      页面    169         st              stacktrace      页面分配的堆栈跟踪
170         ator            allocator       页面    170         ator            allocator       页面的内存分配器
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php