: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 > page_owner_full.txt ./page_owner_sort page_owner_full.txt sorted_page_owner.txt ``page_owner_full.txt`` 的一č¬čľ“出ć…况如下:: Page allocated via order XXX, ... PFN XXX ... // ć čŻ¦ć… Page allocated via order XXX, ... PFN XXX ... // ć čŻ¦ć… é»č®¤ć…况下,ĺ®ĺ°†ä»Ąä¸€ä¸Şç»™ĺ®šçš„pfn开始,ĺšĺ®Ść•´çš„pfn转储,且page_owner支ćŚfseek。 FILE *fp = fopen("/sys/kernel/debug/page_owner", "r"); fseek(fp, pfn_start, SEEK_SET); ``page_owner_sort`` 工具忽略了 ``PFN`` 行,将剩余的行放在bufä¸ďĽŚä˝żç”¨regexpćŹ ĺŹ–éˇµĺşŹĺ€ĽďĽŚč®ˇç®—buf的次数和页数,最ĺŽć ąćŤ®ĺŹ‚ć•°čż›čˇŚćŽ’ĺşŹă€‚ 在 ``sorted_page_owner.txt`` ä¸ĺŹŻä»Ąçś‹ĺ°ĺ…łäşŽč°ĺ†é…Ťäş†ćŻŹä¸Şéˇµéť˘çš„ç»“ćžśă€‚ä¸€č¬čľ“出:: XXX times, XXX pages: Page allocated via order XXX, ... // Detailed stack é»č®¤ć…况下, ``page_owner_sort`` ćŻć ąćŤ®bufçš„ć—¶é—´ćťĄćŽ’ĺşŹçš„ă€‚ĺ¦‚ćžśä˝ ćł ćŚ‰buf的页数排序,请使用-m参数。详细的参数ćŻ: 基本函数:: 排序: -a 按内ĺĺ†é…Ťć—¶é—´ćŽ’ĺşŹ -m 按总内ĺ排序 -p 按pid排序。 -P 按tgid排序。 -n 按任务命令ĺŤç§°ćŽ’ĺşŹă€‚ -r 按内ĺ释放时间排序。 -s ćŚ‰ĺ †ć 跟踪排序。 -t 按时间排序ďĽé»č®¤ďĽ‰ă€‚ --sort <order> 指定排序顺序。排序的čŻćł•ćŻ[+|-]key[,[+|-]key[,...]]。从 **ć ‡ĺ‡†ć ĽĺĽŹćŚ‡ĺ®šĺ™¨**那一节选择一个键。"+"ćŻĺŹŻé€‰çš„ďĽŚĺ› ä¸şé»č®¤çš„ć–ąĺ‘ćŻć•°ĺ—ć– čŻŤćł•çš„ĺ˘žĺŠ ă€‚ĺ…许混ĺä˝żç”¨çĽ©ĺ†™ĺ’Śĺ®Ść•´ć ĽĺĽŹçš„é”®ă€‚ äľ‹ĺ: ./page_owner_sort <input> <output> --sort=n,+pid,-tgid ./page_owner_sort <input> <output> --sort=at ĺ…¶ĺ®ĺ‡˝ć•°:: 剔除: --cull <rules> 指定剔除规ĺ™ă€‚剔除的čŻćł•ćŻkey[,key[,...]]。从**ć ‡ĺ‡†ć ĽĺĽŹćŚ‡ĺ®šĺ™¨** é¨ĺ†é€‰ć‹©ä¸€ä¸Şĺ¤šĺ—母键。 <rules>ćŻä¸€ä¸Şä»Ąé€—号ĺ†éš”çš„ĺ—表形式的单一参数,ĺ®ćŹäľ›äş†ä¸€ç§ŤćŚ‡ĺ®šĺŤ•ä¸Şĺ‰”é™¤č§„ĺ™çš„ 方法。 识ĺ«çš„ĺ…łé”®ĺ—在下面的**ć ‡ĺ‡†ć ĽĺĽŹćŚ‡ĺ®šĺ™¨**é¨ĺ†ćś‰ćŹŹčż°ă€‚<č§„ĺ™>可以通过键的 序ĺ—k1,k2,...ćťĄćŚ‡ĺ®šďĽŚĺś¨ä¸‹éť˘çš„ć ‡ĺ‡†ćŽ’ĺşŹé”®é¨ĺ†ćś‰ćŹŹčż°ă€‚ĺ…许混ĺ使用简写和完整形 式的键。 Examples: ./page_owner_sort <input> <output> --cull=stacktrace ./page_owner_sort <input> <output> --cull=st,pid,name ./page_owner_sort <input> <output> --cull=n,f 过滤: -f 过滤掉内ĺ已被释放的块的信ćŻă€‚ 选择: --pid <pidlist> 按pid选择。这将选择进程ID号出现在<pidlist>ä¸çš„块。 --tgid <tgidlist> 按tgid选择。这将选择其线程组ID号出现在<tgidlist> ä¸çš„块。 --name <cmdlist> 按任务命令ĺŤç§°é€‰ć‹©ă€‚这将选择其任务命令ĺŤç§°ĺ‡şçŽ°ĺś¨ <cmdlist>ä¸çš„区块。 <pidlist>, <tgidlist>, <cmdlist>ćŻä»Ąé€—号ĺ†éš”çš„ĺ—表形式的单个参数, ĺ®ćŹäľ›äş†ä¸€ç§ŤćŚ‡ĺ®šĺŤ•ä¸Şé€‰ć‹©č§„ĺ™çš„方法。 äľ‹ĺ: ./page_owner_sort <input> <output> --pid=1 ./page_owner_sort <input> <output> --tgid=1,2,3 ./page_owner_sort <input> <output> --name name1,name2 ć ‡ĺ‡†ć ĽĺĽŹćŚ‡ĺ®šĺ™¨ ============== :: --sort的选项: çźé”® 长键 描述 p pid 进程ID tg tgid 线程组ID n name 任务命令ĺŤç§° st stacktrace 页面ĺ†é…Ťçš„ĺ †ć 跟踪 T txt 块的全文 ft free_ts éˇµéť˘é‡Šć”ľć—¶çš„ć—¶é—´ćł at alloc_ts 页面被ĺ†é…Ťć—¶çš„ć—¶é—´ćł ator allocator 页面的内ĺĺ†é…Ťĺ™¨ --curl的选项: çźé”® 长键 描述 p pid 进程ID tg tgid 线程组ID n name 任务命令ĺŤç§° f free 该页ćŻĺ¦ĺ·˛ç»Źé‡Šć”ľ st stacktrace 页面ĺ†é…Ťçš„ĺ †ć 跟踪 ator allocator 页面的内ĺĺ†é…Ťĺ™¨