溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

內(nèi)存分析BPF工具

發(fā)布時間:2020-05-25 14:15:12 來源:億速云 閱讀:285 作者:鴿子 欄目:系統(tǒng)運維

內(nèi)核和處理器負責將虛擬內(nèi)存映射到物理內(nèi)存。為了提高效率,會在稱為頁面的內(nèi)存組中創(chuàng)建內(nèi)存映射,其中每個頁面的大小是處理器的詳細信息。盡管大多數(shù)處理器也支持更大的容量,但通常有4 KB,Linux稱其為 hugepage大頁面。內(nèi)核可以從其自己的空閑列表中為物理內(nèi)存頁面請求提供服務,內(nèi)核為每個DRAM組和CPU維護這些請求以提高效率。內(nèi)核自己的軟件也通常通過內(nèi)核分配器(例如slab分配器)從這些空閑列表中消耗內(nèi)存。

內(nèi)存分析BPF工具


內(nèi)存分析BPF工具


內(nèi)存頁和交換

典型的用戶內(nèi)存頁面的生命周期如圖7-2所示,其中列舉了以下步驟:

1.  應用程序從內(nèi)存分配請求開始(例如,libc malloc() )。

2.  分配庫可以從其自己的空閑列表中為內(nèi)存請求提供服務,或者它可能需要擴展虛擬內(nèi)存來容納。根據(jù)分配庫,它將:

1.  通過調(diào)用brk() syscall并將堆內(nèi)存用于分配來擴展堆的大小。

2.  通過mmap() 系統(tǒng)調(diào)用創(chuàng)建一個新的內(nèi)存段。

3.  稍后,應用程序嘗試通過存儲和加載指令使用分配的內(nèi)存范圍,這涉及調(diào)用處理器內(nèi)存管理單元(MMU)進行虛擬到物理地址的轉(zhuǎn)換。至此,虛擬內(nèi)存的謊言就暴露出來了:該地址沒有映射!這會導致稱為頁面錯誤的MMU錯誤。

4.  頁面錯誤由內(nèi)核處理,內(nèi)核建立從其物理內(nèi)存可用列表到虛擬內(nèi)存的映射,然后將該映射通知MMU以供以后查找?,F(xiàn)在,該過程占用了額外的物理內(nèi)存頁面。進程使用的物理內(nèi)存量稱為其駐留集大小(RSS)

5.  當系統(tǒng)上的內(nèi)存需求過多時,內(nèi)核頁面輸出守護程序(kswapd)可能會尋找可用的內(nèi)存頁面。它將釋放三種類型的內(nèi)存中的一種(盡管只有(c)如圖7-2所示,因為它顯示了用戶內(nèi)存頁面的生命周期)

1.  從磁盤讀取但未修改的文件系統(tǒng)頁面(稱為由磁盤支持”):可以立即釋放這些頁面,并在需要時簡單地重新讀取。這些頁面是應用程序可執(zhí)行的文本,數(shù)據(jù)和文件系統(tǒng)元數(shù)據(jù)。

2.  已修改的文件系統(tǒng)頁面:這些是的,必須先寫入磁盤,然后才能釋放它們。

3.  應用程序內(nèi)存頁面:由于它們沒有文件來源,因此被稱為匿名內(nèi)存。如果正在使用交換設備,則可以先將它們存儲在交換設備上來釋放它們。將頁面寫到交換設備稱為交換(Linux)。

內(nèi)存分配請求通常是頻繁的活動:對于繁忙的應用程序,用戶級別的分配每秒可能發(fā)生數(shù)百萬次。加載和存儲指令以及MMU查找更加頻繁。它們每秒可能發(fā)生數(shù)十億次。在圖7-2中,這些箭頭以粗體顯示。其他活動相對較少:brk()mmap()調(diào)用,頁面錯誤和頁面退出(較亮的箭頭)。


page-out daemon頁面輸出守護程序

定期激活頁面輸出守護程序(kswapd)以掃描非活動和活動頁面的LRU列表,以尋找可用的內(nèi)存。如圖7-3所示,當空閑內(nèi)存越過低閾值時它將被喚醒,而當空閑內(nèi)存越過高閾值時將回到睡眠狀態(tài)。

內(nèi)存分析BPF工具

kswapd協(xié)調(diào)后臺頁面調(diào)出;除了CPU和磁盤I/O爭用外,這些不應直接損害應用程序性能。如果kswapd無法足夠快地釋放內(nèi)存,則會超過可調(diào)的最小頁面閾值,并使用直接回收;這是釋放內(nèi)存以滿足分配條件的前臺模式。在這種模式下,分配阻塞(停頓)并同步等待頁面被釋放。

 

直接回收可以調(diào)用內(nèi)核模塊收縮器函數(shù):這些釋放的內(nèi)存可能保留在緩存中的內(nèi)存,包括內(nèi)核slab緩存。

 

 

swap devices交換設備

交換設備為內(nèi)存不足的系統(tǒng)提供了降級的操作模式:進程可以繼續(xù)分配,但是現(xiàn)在將不常使用的頁面移入和移出交換設備,這通常會使應用程序運行得慢得多。

一些生產(chǎn)系統(tǒng)無需交換即可運行;這樣做的理由是,對于那些關(guān)鍵系統(tǒng)來說,降級的操作模式是永遠無法接受的,因為這些關(guān)鍵系統(tǒng)可能有許多冗余(且運行狀況良好)服務器,比開始交換的服務器要好用得多。(例如,對于Netflix云實例,通常就是這種情況。)

如果無交換系統(tǒng)的內(nèi)存不足,則內(nèi)核oom killer會犧牲一個進程。為了避免這種情況,將應用程序配置為永不超過系統(tǒng)的內(nèi)存限制。

 

 

oom killer

Linux內(nèi)存不足殺手是釋放內(nèi)存的最后手段:它將使用啟發(fā)式方法找到受害者進程,并通過殺死它們來犧牲它們。啟發(fā)式尋找將釋放許多頁面的最大受害者,并且這不是關(guān)鍵任務,例如內(nèi)核線程或init(PID 1)Linux提供了在整個系統(tǒng)和每個進程中調(diào)整OOM殺手的行為的方法。

 

 

page compaction頁面壓縮

隨著時間的流逝,釋放的頁面變得碎片化,從而使內(nèi)核很難根據(jù)需要分配較大的連續(xù)塊。內(nèi)核使用壓縮程序來移動頁面,從而釋放連續(xù)區(qū)域。

 

 

file system caching and buffering文件系統(tǒng)緩存和緩沖

Linux借用空閑內(nèi)存進行文件系統(tǒng)緩存,并在有需求時將其恢復為空閑狀態(tài)。這種借用的結(jié)果是,在Linux啟動之后,系統(tǒng)報告的可用內(nèi)存趨向于零,這可能使用戶擔心系統(tǒng)實際上只是在預熱其文件系統(tǒng)緩存時會耗盡內(nèi)存。此外,文件系統(tǒng)使用內(nèi)存進行回寫緩沖(write-back buffering)

 

可以將Linux調(diào)整為更喜歡從文件系統(tǒng)緩存中釋放或通過交換釋放內(nèi)存(通過調(diào)整參數(shù)vm.swappiness)。

 



傳統(tǒng)的分析工具

傳統(tǒng)的性能工具提供了許多基于容量的內(nèi)存使用情況統(tǒng)計信息,包括每個進程和系統(tǒng)范圍內(nèi)使用了多少虛擬和物理內(nèi)存,以及某些細分,例如按流程段或面板。分析內(nèi)存使用率超出基本知識,例如頁面錯誤率,分配庫,運行時或應用程序?qū)γ總€分配都需要內(nèi)置的工具;或者可以使用像Valgrind這樣的虛擬機分析器;后一種方法可能會導致目標應用程序在檢測時運行速度慢10倍以上。BPF工具效率更高,開銷也更小。

 

Tool

Type

Description

dmesg

Kernel log

OOM killer event   details

swapon

Kernel   statistics

Swap device   usage

free

Kernel   statistics

System-wide   memory usage

ps

Kernel   statistics

Process   statistics, including memory usage

pmap

Kernel   statistics

Process memory   usage by segment

vmstat

Kernel statistics

Various   statistics, including memory

sar

Kernel   statistics

Can show page   fault and page scanner rates

perf

Software   events, hardware statistics, hardware sampling

Memory-related   PMC statistics and event sampling



用于內(nèi)存分析相關(guān)的BPF工具

內(nèi)存分析BPF工具


內(nèi)存相關(guān)的工具:

Tool

Source

Target

Description

oomkill

BCC/BT

OOM

Shows extra   info on OOM kill events

顯示oom相關(guān)的事件

memleak

BCC

Sched

Shows possible   memory leak code paths

顯示可能的內(nèi)存泄漏代碼路徑

mmapsnoop

Book

Syscalls

Traces mmap(2)   calls system-wide

跟蹤系統(tǒng)范圍內(nèi)的mmap調(diào)用

brkstack

Book

Syscalls

Shows brk()   calls with user stack traces

顯示帶有用戶堆棧跟蹤的brk()調(diào)用

shmsnoop

BCC

Syscalls

Traces shared   memory calls with details

跟蹤共享內(nèi)存調(diào)用的詳細信息

faults

Book

Faults

Shows page   faults, by user stack trace

通過用戶堆棧跟蹤顯示頁面錯誤

ffaults

Book

Faults

Shows page   faults, by filename

通過文件名顯示頁面錯誤

vmscan

Book

VM

Measures VM   scanner shrink and reclaim times

測量vm scaner的收縮和回收時間

drsnoop

BCC

VM

Traces direct   reclaim events, showing latency

跟蹤直接回收事件,顯示延遲

swapin

Book

VM

Shows swap-ins   by process

按進程顯示swap情況

hfaults

Book

Faults

Shows huge   page faults, by process

按進程顯示巨頁錯誤情況

 

此外,還有幾個用于內(nèi)存分析的BPF工具: kmem 、kpages 、 slabratetop 、 numamove


oomkill

oomkill是一個BCCbpftrace工具,用于跟蹤內(nèi)存不足殺手事件并打印詳細信息(例如平均負載)。平均負載為OOM時的系統(tǒng)狀態(tài)提供了一些額外的上下文,顯示了系統(tǒng)是否正在變得忙碌或穩(wěn)定。

內(nèi)存分析BPF工具

此輸出表明PID 18601(perl)需要內(nèi)存,這觸發(fā)了PID 1165(java)OOM終止。PID 1165的內(nèi)存占用已達到18006224pages;這些通常每頁4 KB,具體取決于處理器和進程內(nèi)存設置。loadavg平均負載表明,在OOM終止時,系統(tǒng)變得更加繁忙。

 

該工具通過使用kprobes跟蹤oom_kill_process() 函數(shù)并打印各種細節(jié)來工作。在這種情況下,只需讀取/proc/loadavg即可獲取平均負載。調(diào)試OOM事件時,可以根據(jù)需要增強此工具以打印其他詳細信息。此外,此工具尚未使用可以顯示有關(guān)如何選擇任務的更多詳細信息的oom跟蹤點。


memleak

memleak是一個BCC工具,可跟蹤內(nèi)存分配和空閑事件以及分配堆棧跟蹤。隨著時間的流逝,它可以顯示長期幸存者-尚未釋放的分配。

此示例顯示了在bash shell進程上運行的memleak

 內(nèi)存分析BPF工具

 

memleak不能告訴您這些分配是否是真正的內(nèi)存泄漏(內(nèi)存泄漏:指的是沒有引用并且永遠不會釋放的已分配內(nèi)存),內(nèi)存增長還是長期分配。為了區(qū)分它們,需要研究和理解代碼路徑。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI