二維碼
        企資網

        掃一掃關注

        當前位置: 首頁 » 企資頭條 » 人物 » 正文

        如何跟蹤誰分配的每個頁面?

        放大字體  縮小字體 發布日期:2023-02-07 05:15:13    瀏覽次數:46
        導讀

        問題背景Linux中常用得內存分配API主要包括基于slab/slub得kmalloc等APIvmalloc相關APIalloc_pages等直接基于buddy得API我們可以在/proc/meminfo中輕易得到關于通過slab/slub API 或者vmalloc分配到得內存。然而除非

        問題背景

        Linux中常用得內存分配API主要包括

          基于slab/slub得kmalloc等API
          vmalloc相關API
          alloc_pages等直接基于buddy得API

          我們可以在/proc/meminfo中輕易得到關于通過slab/slub API 或者vmalloc分配到得內存。然而除非內核模塊主動進行統計,內核并沒有直接提供一個類似meminfo得方案來統計通過alloc_pages相關API申請得內存。所以有時候當kernel發生OOM得時候,我們發現有大量得內存是unaccount得。

          為了統計這些直接從buddy申請走得內存,內核提供了page owner功能。

          概述

          page owner是用來追蹤誰分配得每一個頁面。它可以用來調試內存泄漏或找到內存占用者。當分配發生時,有關分配得信息,如調用堆棧和頁面得順序被存儲到每個頁面得特定存儲中。當我們需要了解所有頁面得狀態時,我們可以獲得并分析這些信息。

          盡管我們已經有了追蹤頁面分配/釋放得tracepoint,但用它來分析誰分配得每個頁面是相當復雜得。我們需要擴大跟蹤緩沖區,以防止在用戶空間程序啟動前出現重疊。而且,啟動得程序會不斷地將跟蹤緩沖區轉出,供以后分析,這將會改變系統得行為,會產生更多得可能性,而不是僅僅保留在內存中,所以不利于調試。頁面所有者也可以用于各種目得。例如,可以通過每個頁面得gfp標志信息獲得精確得碎片 統計。如果啟用了page owner,它就已經實現并激活了。我們非常歡迎其他用途。

          page owner在默認情況下是禁用得。所以,如果你想使用它,你需要在你得啟動cmdline 中加入”page_owner=on”。如果內核是用page owner構建得(使能宏CONFIG_PAGE_OWNER),并且由于沒有啟用啟動選項而在運行時禁用page owner(即沒有在boot cmdline中添加 page_owner=on),那么運行時得開銷是很小得。如果在運行時禁用,它不需要內存來存儲所有者信息,所以沒有運行時內存開銷。而且,page owner在頁面分配器得熱路徑中只插入了兩個不可能得分支,如果不啟用,那么分配就會像沒有page owner得內核一樣進行。這兩個不可能得分支應該不會影響到分配得性能,特別是在靜態鍵跳轉標簽修補功能可用得情況下。以下是由于這個功能而導致得內核代碼大小得變化。

          沒有page owner:

          text data bss dec hex filename
          48392 2333 644 51369 c8a9 mm/page_alloc.o

          有page owner:

          text data bss dec hex filename
          48800 2445 644 51889 cab1 mm/page_alloc.o
          6662 108 29 6799 1a8f mm/page_owner.o
          1025 8 8 1041 411 mm/page_ext.o

          雖然總共增加了8KB得代碼,但page_alloc.o增加了520字節,其中不到一半是在hotpath中。構建帶有page owner得內核,并在需要時打開它,將是調試內核內存問題得可靠些選擇。

          有一個問題是由實現細節引起得。頁所有者將信息存儲到struct page擴展得內存中。這個內存得初始化時間比稀疏內存系統中得頁面分配器啟動得時間要晚一些,所以,在初始化之前,許多頁面可以被分配,但它們沒有所有者信息。為了解決這個問題,這些早期分配得 頁面在初始化階段被調查并標記為分配。雖然這并不意味著它們有正確得所有者信息,但至少,我們可以更準確地判斷該頁是否被分配。在2GB內存得x86-64虛擬機上,有13343 個早期分配得頁面被捕捉和標記,盡管它們大部分是由結構頁擴展功能分配得。總之,在這之后,沒有任何頁面處于未追蹤狀態。

          使用方法
            構建用戶空間得幫助

            cd tools/vm

            make page_owner_sort

              啟用page owner: 添加 “page_owner=on” 到 boot cmdline.
              做你想調試得工作
              分析來自頁面所有者得信息

              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 ...
              // Detailed stack

              Page allocated via order XXX, ...
              PFN XXX ...
              // Detailed stack

              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參數。詳細得參數是:

              基本函數:

              Sort:

              -a
              按內存分配時間排序
              -m
              按總內存排序
              -p
              按pid排序
              -P
              按tgid排序
              -r
              按內存釋放時間排序
              -s
              按堆棧跟蹤排序
              -t
              按時間排序(默認)

              其它函數:

              Cull:
              -c
              通過比較堆棧跟蹤而不是總塊來進行剔除

              Filter:
              -f
              過濾掉內存已被釋放得塊得信息

        end


        人人極客社區


        感謝對創作者的支持,回復【peter】海量Linux資料贈送

        文章推薦

        ?【專輯】
        ?【專輯】
         
        (文/小編)
        打賞
        免責聲明
        本文為小編推薦作品?作者: 小編。歡迎轉載,轉載請注明原文出處:http://www.sneakeraddict.net/news/show-320799.html 。本文僅代表作者個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,作者需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

        粵ICP備16078936號

        微信

        關注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯系
        客服

        聯系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        91精品日韩人妻无码久久不卡| 国产白丝无码免费视频| 亚洲日韩精品A∨片无码| 国产亚洲精品无码专区| 亚洲日韩AV一区二区三区中文| 亚洲av中文无码乱人伦在线r▽| 国产激情无码视频在线播放性色| 中文字幕AV中文字无码亚| 亚洲av无码一区二区三区乱子伦 | 无码人妻熟妇AV又粗又大| 精品久久久久久无码人妻蜜桃| 中文字幕日本在线观看| yy111111少妇无码影院| 伊人蕉久中文字幕无码专区| 99久久国产热无码精品免费| 中文字幕日韩欧美| 中文亚洲欧美日韩无线码| 精品久久无码中文字幕| 日韩精品无码免费专区午夜不卡| 免费AV一区二区三区无码| 亚洲Av无码专区国产乱码DVD| 无码超乳爆乳中文字幕久久| 国产激情无码一区二区app| 久久亚洲AV成人无码| 一本无码中文字幕在线观| 国99精品无码一区二区三区| 亚洲精品无码久久久久久| 中文字幕免费在线| 中文日韩亚洲欧美字幕| 国产精品va无码一区二区| 亚洲不卡中文字幕无码| 天堂网www中文在线资源| 中文字幕有码无码AV| 99热门精品一区二区三区无码 | 无码中文字幕日韩专区视频| 成年午夜无码av片在线观看| 亚洲日韩精品一区二区三区无码 | 中文字幕在线观看| 欧美日韩中文国产一区发布| 97久久精品无码一区二区天美| 无码少妇一区二区性色AV|