0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核內(nèi)存泄漏怎么辦?

Linux閱碼場(chǎng) ? 來(lái)源:Linuxer ? 作者:Linuxer ? 2021-02-20 17:14 ? 次閱讀

什么是內(nèi)存泄漏:

程序向系統(tǒng)申請(qǐng)內(nèi)存,使用完不需要之后,不釋放內(nèi)存還給系統(tǒng)回收,造成申請(qǐng)的內(nèi)存被浪費(fèi).

發(fā)現(xiàn)系統(tǒng)中內(nèi)存使用量隨著時(shí)間的流逝,消耗的越來(lái)越多,例如下圖所示:

2146195a-71ad-11eb-8b86-12bb97331649.png

接下來(lái)的排查思路是:

1.監(jiān)控系統(tǒng)中每個(gè)用戶(hù)進(jìn)程消耗的PSS (使用pmap工具(pmap pid)).

PSS:按比例報(bào)告的物理內(nèi)存,比如進(jìn)程A占用20M物理內(nèi)存,進(jìn)程B和進(jìn)程A共享5M物理內(nèi)存,那么進(jìn)程A的PSS就是(20 - 5) + 5/2 = 17.5M

2.監(jiān)控/proc/meminfo輸出,重點(diǎn)觀(guān)察Slab使用量和slab對(duì)應(yīng)的/proc/slabinfo信息

3.參考/proc/meminfo輸出,計(jì)算系統(tǒng)中未被統(tǒng)計(jì)的內(nèi)存變化,比如內(nèi)核驅(qū)動(dòng)代碼

直接調(diào)用alloc_page()從buddy中拿走的內(nèi)存不會(huì)被單獨(dú)統(tǒng)計(jì)

以上排查思路分別對(duì)應(yīng)下圖中的1,2,3 :

21681050-71ad-11eb-8b86-12bb97331649.png

在排查的過(guò)程中發(fā)現(xiàn)系統(tǒng)非??臻e,都沒(méi)有跑任何用戶(hù)業(yè)務(wù)進(jìn)程。

其中在使用slabtop監(jiān)控slab的使用情況時(shí)發(fā)現(xiàn)size-4096 不停增長(zhǎng)

2190c540-71ad-11eb-8b86-12bb97331649.png

通過(guò)監(jiān)控/proc/slabinfo也發(fā)現(xiàn)SReclaimable 的使用量不停增長(zhǎng)

while true; do sleep 1 ; cat /proc/slabinfo >> /tmp/slabinfo.txt ; echo "===" >> /tmp/slabinfo.txt ; done

由此判斷很可能是內(nèi)核空間在使用size-4096 時(shí)發(fā)生了內(nèi)存泄漏.

接下來(lái)使用trace event(tracepoint)功能來(lái)監(jiān)控size-4096的使用和釋放過(guò)程,

主要用來(lái)跟蹤kmalloc()和kfree()函數(shù)對(duì)應(yīng)的trace event, 因?yàn)樗麄兊膖race event被觸發(fā)之后會(huì)打印kmalloc()和kfree()所申請(qǐng)和釋放的內(nèi)存地址,然后進(jìn)一步只過(guò)濾申請(qǐng)4096字節(jié)的情況。

#trace-cmd record -e kmalloc -f 'bytes_alloc==4096' -e kfree -T

(-T 打印堆棧)

等待幾分鐘之后…

#ctrl ^c 中斷trace-cmd

#trace-cmd report

以上步驟相當(dāng)于:

21bb5b0c-71ad-11eb-8b86-12bb97331649.png

等待幾分鐘之后…

#cp /sys/kernel/debug/tracing/trace_pipe /tmp/kmalloc-trace

從trace-cmd report的輸出結(jié)果來(lái)看,很多kmalloc 對(duì)應(yīng)的ptr值都沒(méi)有kfree與之對(duì)應(yīng)的ptr值

21e57f2c-71ad-11eb-8b86-12bb97331649.png

這就說(shuō)明了cat進(jìn)程在內(nèi)核空間使用size-4096之后并沒(méi)有釋放,造成了內(nèi)存泄漏。

為了進(jìn)一步精確定位到是使用哪個(gè)內(nèi)核函數(shù)造成的問(wèn)題,此時(shí)手動(dòng)觸發(fā)vmcore

#echo c > /proc/sysrq-trigger

然后使用crash工具分析vmcore:

#crash ./vmcore ./vmlinux.debug

讀出上面kmalloc申請(qǐng)的ptr內(nèi)存信息

22431312-71ad-11eb-8b86-12bb97331649.png

(讀取0xffff880423744000內(nèi)存開(kāi)始的4096個(gè)字節(jié),并以字符形式顯示)

22576916-71ad-11eb-8b86-12bb97331649.png

發(fā)現(xiàn)從上面幾個(gè)ptr內(nèi)存中讀出的內(nèi)容都是非常相似,仔細(xì)看一下發(fā)現(xiàn)都是/proc/schedstat 的輸出內(nèi)容。

通過(guò)閱讀相關(guān)代碼發(fā)現(xiàn),當(dāng)讀出/proc/schedstat內(nèi)容之后,確實(shí)沒(méi)有釋放內(nèi)存

228f9db8-71ad-11eb-8b86-12bb97331649.png

然后發(fā)現(xiàn)kernel上游已經(jīng)有patch解決了這個(gè)問(wèn)題:

commit: 8e0bcc722289

fix a leak in /proc/schedstats

原文標(biāo)題:一次解決Linux內(nèi)核內(nèi)存泄漏實(shí)戰(zhàn)全過(guò)程

文章出處:【微信公眾號(hào):Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40084
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207908

原文標(biāo)題:一次解決Linux內(nèi)核內(nèi)存泄漏實(shí)戰(zhàn)全過(guò)程

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言內(nèi)存泄漏問(wèn)題原理

    內(nèi)存泄漏問(wèn)題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問(wèn)題,因?yàn)闂?/div>
    發(fā)表于 03-19 11:38 ?387次閱讀
    C語(yǔ)言<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問(wèn)題原理

    風(fēng)機(jī)軸磨損怎么辦

    電子發(fā)燒友網(wǎng)站提供《風(fēng)機(jī)軸磨損怎么辦.docx》資料免費(fèi)下載
    發(fā)表于 01-07 11:04 ?0次下載

    Linux內(nèi)核內(nèi)存管理架構(gòu)解析

    內(nèi)存管理子系統(tǒng)可能是linux內(nèi)核中最為復(fù)雜的一個(gè)子系統(tǒng),其支持的功能需求眾多,如頁(yè)面映射、頁(yè)面分配、頁(yè)面回收、頁(yè)面交換、冷熱頁(yè)面、緊急頁(yè)面、頁(yè)面碎片管理、頁(yè)面緩存、頁(yè)面統(tǒng)計(jì)等,而且對(duì)性能也有很高
    的頭像 發(fā)表于 01-04 09:24 ?554次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>內(nèi)存</b>管理架構(gòu)解析

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案? 內(nèi)存溢出和內(nèi)存泄漏是計(jì)算機(jī)科學(xué)中常見(jiàn)的問(wèn)題,在開(kāi)發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?1816次閱讀

    連接相機(jī)丟包怎么辦?如何設(shè)置網(wǎng)卡屬性?

    連接相機(jī)丟包怎么辦?如何設(shè)置網(wǎng)卡屬性?
    的頭像 發(fā)表于 12-12 16:26 ?520次閱讀
    連接相機(jī)丟包<b class='flag-5'>怎么辦</b>?如何設(shè)置網(wǎng)卡屬性?

    pcb鉆孔偏孔了怎么辦?

    pcb鉆孔偏孔了怎么辦?
    的頭像 發(fā)表于 11-22 11:10 ?2642次閱讀
    pcb鉆孔偏孔了<b class='flag-5'>怎么辦</b>?

    如何發(fā)現(xiàn)內(nèi)存泄漏

    檢測(cè)兩個(gè)角度介紹在 Linux 環(huán)境進(jìn)行內(nèi)存泄漏檢測(cè)的方法,并重點(diǎn)介紹靜態(tài)分析工具 BEAM、動(dòng)態(tài)監(jiān)測(cè)工具 Valgrind 和 rational purify 的使用方法。相信通過(guò)本文的介紹,能給大家對(duì)處理其它產(chǎn)品或項(xiàng)目
    的頭像 發(fā)表于 11-13 15:41 ?485次閱讀

    線(xiàn)程內(nèi)存泄漏問(wèn)題的定位

    記錄一個(gè)關(guān)于線(xiàn)程內(nèi)存泄漏問(wèn)題的定位過(guò)程,以及過(guò)程中的收獲。 1. 初步定位 是否存在內(nèi)存泄漏:想到內(nèi)存
    的頭像 發(fā)表于 11-13 11:38 ?509次閱讀
    線(xiàn)程<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問(wèn)題的定位

    Linux內(nèi)核內(nèi)存規(guī)整總結(jié)

    1.前言 伙伴系統(tǒng)作為內(nèi)核最基礎(chǔ)的物理頁(yè)內(nèi)存分配器,具有高效、實(shí)現(xiàn)邏輯簡(jiǎn)介等優(yōu)點(diǎn),其原理頁(yè)也盡可能降低內(nèi)存外部碎片產(chǎn)生,但依然無(wú)法杜絕碎片問(wèn)題。外部碎片帶來(lái)的最大影響就是內(nèi)存足夠,但是
    的頭像 發(fā)表于 11-11 11:17 ?1148次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>內(nèi)存</b>規(guī)整總結(jié)

    內(nèi)存泄漏會(huì)產(chǎn)生哪些后果

    內(nèi)存泄漏原因 內(nèi)存泄漏在C/C++這種不帶GC(Garbage Collection)的語(yǔ)言里,是一個(gè)經(jīng)常發(fā)生的問(wèn)題。因?yàn)闆](méi)有GC,所以分配的內(nèi)存
    的頭像 發(fā)表于 11-10 15:06 ?675次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>會(huì)產(chǎn)生哪些后果

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對(duì)系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮等一系列操作的管理。在
    的頭像 發(fā)表于 11-10 14:58 ?431次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)存</b>管理總結(jié)

    內(nèi)存泄漏如何避免

    的數(shù),那就是內(nèi)存溢出。 2. 內(nèi)存泄漏 內(nèi)存泄露 memory leak,是指程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已申請(qǐng)的
    的頭像 發(fā)表于 11-10 11:04 ?592次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>如何避免

    linux系統(tǒng)內(nèi)存不夠怎么辦

    在嵌入式系統(tǒng)中,內(nèi)存是比較緊缺的資源,特別是在消費(fèi)類(lèi)產(chǎn)品中, 為了節(jié)省成本,一般都會(huì)將硬件資源應(yīng)用到極致。在開(kāi)發(fā)過(guò)程中,就經(jīng)常會(huì)遇到,運(yùn)行內(nèi)存(RAM)就還差一點(diǎn),但就是不夠用的情況。
    發(fā)表于 11-10 09:39 ?1335次閱讀
    <b class='flag-5'>linux</b>系統(tǒng)<b class='flag-5'>內(nèi)存</b>不夠<b class='flag-5'>怎么辦</b>

    電機(jī)過(guò)熱怎么辦?

    電機(jī)過(guò)熱怎么辦?WAYON維安PPTC有方案
    的頭像 發(fā)表于 11-01 15:08 ?597次閱讀
    電機(jī)過(guò)熱<b class='flag-5'>怎么辦</b>?

    什么是內(nèi)存泄漏?如何避免JavaScript內(nèi)存泄漏

    JavaScript 代碼中常見(jiàn)的內(nèi)存泄漏的常見(jiàn)來(lái)源: 研究內(nèi)存泄漏問(wèn)題就相當(dāng)于尋找符合垃圾回收機(jī)制的編程方式,有效避免對(duì)象引用的問(wèn)題。
    發(fā)表于 10-27 11:30 ?273次閱讀
    什么是<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>?如何避免JavaScript<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>