內(nèi)核和處理器負(fù)責(zé)將虛擬內(nèi)存映射到物理內(nèi)存。為了提高效率,會在稱為頁面的內(nèi)存組中創(chuàng)建內(nèi)存映射,其中每個頁面的大小是處理器的詳細(xì)信息。盡管大多數(shù)處理器也支持更大的容量,但通常有4 KB,Linux稱其為 hugepage大頁面。內(nèi)核可以從其自己的空閑列表中為物理內(nèi)存頁面請求提供服務(wù),內(nèi)核為每個DRAM組和CPU維護這些請求以提高效率。內(nèi)核自己的軟件也通常通過內(nèi)核分配器(例如slab分配器)從這些空閑列表中消耗內(nèi)存。
內(nèi)存頁和交換
典型的用戶內(nèi)存頁面的生命周期如圖7-2所示,其中列舉了以下步驟:
1. 應(yīng)用程序從內(nèi)存分配請求開始(例如,libc malloc() )。
2. 分配庫可以從其自己的空閑列表中為內(nèi)存請求提供服務(wù),或者它可能需要擴展虛擬內(nèi)存來容納。根據(jù)分配庫,它將:
1. 通過調(diào)用brk() syscall并將堆內(nèi)存用于分配來擴展堆的大小。
2. 通過mmap()系統(tǒng)調(diào)用創(chuàng)建一個新的內(nèi)存段。
3. 稍后,應(yīng)用程序嘗試通過存儲和加載指令使用分配的內(nèi)存范圍,這涉及調(diào)用處理器內(nèi)存管理單元(MMU)進行虛擬到物理地址的轉(zhuǎn)換。至此,虛擬內(nèi)存的謊言就暴露出來了:該地址沒有映射!這會導(dǎo)致稱為頁面錯誤的MMU錯誤。
4. 頁面錯誤由內(nèi)核處理,內(nèi)核建立從其物理內(nèi)存可用列表到虛擬內(nèi)存的映射,然后將該映射通知MMU以供以后查找?,F(xiàn)在,該過程占用了額外的物理內(nèi)存頁面。進程使用的物理內(nèi)存量稱為其駐留集大小(RSS)。
5. 當(dāng)系統(tǒng)上的內(nèi)存需求過多時,內(nèi)核頁面輸出守護程序(kswapd)可能會尋找可用的內(nèi)存頁面。它將釋放三種類型的內(nèi)存中的一種(盡管只有(c)如圖7-2所示,因為它顯示了用戶內(nèi)存頁面的生命周期):
1. 從磁盤讀取但未修改的文件系統(tǒng)頁面(稱為“由磁盤支持”):可以立即釋放這些頁面,并在需要時簡單地重新讀取。這些頁面是應(yīng)用程序可執(zhí)行的文本,數(shù)據(jù)和文件系統(tǒng)元數(shù)據(jù)。
2. 已修改的文件系統(tǒng)頁面:這些是“臟”的,必須先寫入磁盤,然后才能釋放它們。
3. 應(yīng)用程序內(nèi)存頁面:由于它們沒有文件來源,因此被稱為匿名內(nèi)存。如果正在使用交換設(shè)備,則可以先將它們存儲在交換設(shè)備上來釋放它們。將頁面寫到交換設(shè)備稱為交換(在Linux上)。
內(nèi)存分配請求通常是頻繁的活動:對于繁忙的應(yīng)用程序,用戶級別的分配每秒可能發(fā)生數(shù)百萬次。加載和存儲指令以及MMU查找更加頻繁。它們每秒可能發(fā)生數(shù)十億次。在圖7-2中,這些箭頭以粗體顯示。其他活動相對較少:brk()和mmap()調(diào)用,頁面錯誤和頁面退出(較亮的箭頭)。
page-out daemon頁面輸出守護程序
定期激活頁面輸出守護程序(kswapd)以掃描非活動和活動頁面的LRU列表,以尋找可用的內(nèi)存。如圖7-3所示,當(dāng)空閑內(nèi)存越過低閾值時它將被喚醒,而當(dāng)空閑內(nèi)存越過高閾值時將回到睡眠狀態(tài)。
kswapd協(xié)調(diào)后臺頁面調(diào)出;除了CPU和磁盤I/O爭用外,這些不應(yīng)直接損害應(yīng)用程序性能。如果kswapd無法足夠快地釋放內(nèi)存,則會超過可調(diào)的最小頁面閾值,并使用直接回收;這是釋放內(nèi)存以滿足分配條件的前臺模式。在這種模式下,分配阻塞(停頓)并同步等待頁面被釋放。
直接回收可以調(diào)用內(nèi)核模塊收縮器函數(shù):這些釋放的內(nèi)存可能保留在緩存中的內(nèi)存,包括內(nèi)核slab緩存。
swap devices交換設(shè)備
交換設(shè)備為內(nèi)存不足的系統(tǒng)提供了降級的操作模式:進程可以繼續(xù)分配,但是現(xiàn)在將不常使用的頁面移入和移出交換設(shè)備,這通常會使應(yīng)用程序運行得慢得多。
一些生產(chǎn)系統(tǒng)無需交換即可運行;這樣做的理由是,對于那些關(guān)鍵系統(tǒng)來說,降級的操作模式是永遠(yuǎn)無法接受的,因為這些關(guān)鍵系統(tǒng)可能有許多冗余(且運行狀況良好)服務(wù)器,比開始交換的服務(wù)器要好用得多。(例如,對于Netflix云實例,通常就是這種情況。)
如果無交換系統(tǒng)的內(nèi)存不足,則內(nèi)核oom killer會犧牲一個進程。為了避免這種情況,將應(yīng)用程序配置為永不超過系統(tǒng)的內(nèi)存限制。
oom killer
Linux內(nèi)存不足殺手是釋放內(nèi)存的最后手段:它將使用啟發(fā)式方法找到受害者進程,并通過殺死它們來犧牲它們。啟發(fā)式尋找將釋放許多頁面的大受害者,并且這不是關(guān)鍵任務(wù),例如內(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)緩存,并在有需求時將其恢復(fù)為空閑狀態(tài)。這種借用的結(jié)果是,在Linux啟動之后,系統(tǒng)報告的可用內(nèi)存趨向于零,這可能使用戶擔(dān)心系統(tǒng)實際上只是在預(yù)熱其文件系統(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)存,以及某些細(xì)分,例如按流程段或面板。分析內(nèi)存使用率超出基本知識,例如頁面錯誤率,分配庫,運行時或應(yīng)用程序?qū)γ總€分配都需要內(nèi)置的工具;或者可以使用像Valgrind這樣的虛擬機分析器;后一種方法可能會導(dǎo)致目標(biāo)應(yīng)用程序在檢測時運行速度慢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)存相關(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)用的詳細(xì)信息 |
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是一個BCC和bpftrace工具,用于跟蹤內(nèi)存不足殺手事件并打印詳細(xì)信息(例如平均負(fù)載)。平均負(fù)載為OOM時的系統(tǒng)狀態(tài)提供了一些額外的上下文,顯示了系統(tǒng)是否正在變得忙碌或穩(wěn)定。
此輸出表明PID 18601(perl)需要內(nèi)存,這觸發(fā)了PID 1165(java)的OOM終止。PID 1165的內(nèi)存占用已達(dá)到18006224個pages;這些通常每頁4 KB,具體取決于處理器和進程內(nèi)存設(shè)置。loadavg平均負(fù)載表明,在OOM終止時,系統(tǒng)變得更加繁忙。
該工具通過使用kprobes跟蹤oom_kill_process()函數(shù)并打印各種細(xì)節(jié)來工作。在這種情況下,只需讀取/proc/loadavg即可獲取平均負(fù)載。調(diào)試OOM事件時,可以根據(jù)需要增強此工具以打印其他詳細(xì)信息。此外,此工具尚未使用可以顯示有關(guān)如何選擇任務(wù)的更多詳細(xì)信息的oom跟蹤點。
memleak是一個BCC工具,可跟蹤內(nèi)存分配和空閑事件以及分配堆棧跟蹤。隨著時間的流逝,它可以顯示長期幸存者-尚未釋放的分配。
此示例顯示了在bash shell進程上運行的memleak:
僅memleak不能告訴您這些分配是否是真正的內(nèi)存泄漏(內(nèi)存泄漏:指的是沒有引用并且永遠(yuǎn)不會釋放的已分配內(nèi)存),內(nèi)存增長還是長期分配。為了區(qū)分它們,需要研究和理解代碼路徑。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁題目:內(nèi)存分析BPF工具-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://jinyejixie.com/article46/eiohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、搜索引擎優(yōu)化、響應(yīng)式網(wǎng)站、網(wǎng)站建設(shè)、Google、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容