91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2021-02-20 17:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

接下來的排查思路是:

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

PSS:按比例報告的物理內(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輸出,重點觀察Slab使用量和slab對應(yīng)的/proc/slabinfo信息

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

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

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

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

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

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

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

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

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

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

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

主要用來跟蹤kmalloc()和kfree()函數(shù)對應(yīng)的trace event, 因為他們的trace event被觸發(fā)之后會打印kmalloc()和kfree()所申請和釋放的內(nèi)存地址,然后進(jìn)一步只過濾申請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é)果來看,很多kmalloc 對應(yīng)的ptr值都沒有kfree與之對應(yīng)的ptr值

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

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

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

#echo c > /proc/sysrq-trigger

然后使用crash工具分析vmcore:

#crash ./vmcore ./vmlinux.debug

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

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

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

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

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

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

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

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

commit: 8e0bcc722289

fix a leak in /proc/schedstats

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

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

責(zé)任編輯:haq

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

    關(guān)注

    4

    文章

    1467

    瀏覽量

    42867
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    219000

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個系統(tǒng)穩(wěn)定運行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動開
    的頭像 發(fā)表于 02-10 16:58 ?3629次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b>申請函數(shù)詳解:從原理到實戰(zhàn)

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認(rèn)的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務(wù)、大數(shù)據(jù)處理、容器化部署等場景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?419次閱讀

    智能顯示模塊上電后顯示“No Project”怎么辦?

    智能顯示模塊上電后顯示“No Project”怎么辦
    發(fā)表于 01-20 15:20

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個內(nèi)存地址是虛擬的,不是直接指向RAM中的任何地址。當(dāng)用戶訪問內(nèi)存中的存儲單元時,都會進(jìn)行地址轉(zhuǎn)換以匹配相應(yīng)的物理內(nèi)存。書籍的第10章討論了五個主題,對Linux
    發(fā)表于 01-16 20:05

    rk基于linux/android內(nèi)存管理

    內(nèi)核對容量的識別), 64 位平臺上認(rèn)為所有內(nèi)存都可 用。然后通過一系列 reserve_xxx() 接口從內(nèi)存末尾往前預(yù)留需要的內(nèi)存,最后把自己 relocate 到某段 reser
    的頭像 發(fā)表于 12-15 10:42 ?203次閱讀
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>內(nèi)存</b>管理

    使用單片機(jī)系統(tǒng)時間不準(zhǔn)怎么辦?

    使用單片機(jī)系統(tǒng)時間不準(zhǔn),怎么辦?具體的是與晶振有關(guān)系還是MCU內(nèi)部有關(guān)系,時間一長顯示的時間就慢了
    發(fā)表于 12-05 07:51

    請問單片機(jī)RAM空間不夠用了怎么辦?

    單片機(jī)RAM空間不夠用了怎么辦?
    發(fā)表于 11-25 08:09

    at_device 包 ml307長時間運行有內(nèi)存泄漏問題怎么解決?

    使用 at_device 包中的 ml307 包長時間運行有大量內(nèi)存泄漏問題,大概漲了20K,求助解決。
    發(fā)表于 09-24 07:41

    電腦開機(jī)每次自動開啟很多軟件怎么辦?

    電腦開機(jī)每次自動開啟很多軟件怎么辦
    發(fā)表于 07-17 06:40

    路由器能連上但是沒有網(wǎng)絡(luò)怎么辦

    路由器能連上但是沒有網(wǎng)絡(luò)怎么辦
    發(fā)表于 07-10 06:15

    在OpenVINO? C++代碼中啟用 AddressSanitizer 時的內(nèi)存泄漏怎么解決?

    在 OpenVINO? C++代碼中啟用 AddressSanitizer 時遇到內(nèi)存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發(fā)表于 06-23 07:16

    如何配置和驗證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運維和性能優(yōu)化中,內(nèi)核參數(shù)(sysctl)的配置至關(guān)重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡(luò)性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗證這些參數(shù)是否生效同樣關(guān)鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1147次閱讀

    電腦連接到openmv,但不會自動彈出盤符,請問怎么辦?

    電腦連接到openmv,但不會自動彈出盤符,請問怎么辦
    發(fā)表于 05-27 06:53

    FPGA的Jtag接口燒了,怎么辦?

    在展開今天的文章前,先來討論一個問題:FPGA的jtag接口燒了怎么辦?JTAG接口的輸入引腳通常設(shè)計為高阻抗,這使得它們對靜電電荷積累非常敏感,由于JTAG接口需要頻繁連接調(diào)試器、下載線纜等外
    的頭像 發(fā)表于 04-27 11:01 ?2617次閱讀
    FPGA的Jtag接口燒了,<b class='flag-5'>怎么辦</b>?

    樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實時Linux 4.19內(nèi)核的延遲測試

    引言本文是對我之前關(guān)于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標(biāo)準(zhǔn)內(nèi)核,以及應(yīng)用了RT補(bǔ)丁的相似內(nèi)核版本。對于實時版,我
    的頭像 發(fā)表于 03-25 09:39 ?808次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測試