一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核內存泄漏怎么辦?

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

掃碼添加小助手

加入工程師交流群

什么是內存泄漏:

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

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

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

接下來的排查思路是:

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

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

2.監(jiān)控/proc/meminfo輸出,重點觀察Slab使用量和slab對應的/proc/slabinfo信息

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

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

以上排查思路分別對應下圖中的1,2,3 :

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

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

其中在使用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

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

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

主要用來跟蹤kmalloc()和kfree()函數(shù)對應的trace event, 因為他們的trace event被觸發(fā)之后會打印kmalloc()和kfree()所申請和釋放的內存地址,然后進一步只過濾申請4096字節(jié)的情況。

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

(-T 打印堆棧)

等待幾分鐘之后…

#ctrl ^c 中斷trace-cmd

#trace-cmd report

以上步驟相當于:

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

等待幾分鐘之后…

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

從trace-cmd report的輸出結果來看,很多kmalloc 對應的ptr值都沒有kfree與之對應的ptr值

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

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

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

#echo c > /proc/sysrq-trigger

然后使用crash工具分析vmcore:

#crash ./vmcore ./vmlinux.debug

讀出上面kmalloc申請的ptr內存信息

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

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

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

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

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

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

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

commit: 8e0bcc722289

fix a leak in /proc/schedstats

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

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    3

    文章

    1416

    瀏覽量

    41443
  • Linux
    +關注

    關注

    87

    文章

    11511

    瀏覽量

    213837

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

    Linux系統(tǒng)中通過預留物理內存實現(xiàn)ARM與FPGA高效通信的方法

    管理子系統(tǒng)管理。因此,需要預留一部分物理內存,使其不被內核管理。接下來將為大家詳細介紹在 Linux 系統(tǒng)中通過預留物理內存實現(xiàn) ARM 與 FPGA 高效通信的方法,預留物理
    的頭像 發(fā)表于 04-16 13:42 ?683次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)中通過預留物理<b class='flag-5'>內存</b>實現(xiàn)ARM與FPGA高效通信的方法

    內存泄漏檢測工具Sanitizer介紹

    內存泄漏,我們經常會遇到,如何檢測內存泄漏,除了我們之前講過的 valgrind,還可以使用 gcc 自帶的工具 sanitizer。
    的頭像 發(fā)表于 03-01 14:52 ?720次閱讀

    開關電源漏電怎么辦?開關電源漏電流標準是什么?

    在現(xiàn)在水電工程中,開關電源是必不可少的家居用品,開關電源漏電怎么辦,市面上開關電源產品還是不少的,功能很多,品牌也不少,所以,選擇的時候也需要特別注意。好的品牌就會避免漏電的情況出現(xiàn),開關電源漏電
    發(fā)表于 01-09 13:59

    Linux下如何管理虛擬內存 使用虛擬內存時的常見問題

    Linux系統(tǒng)中,虛擬內存管理是操作系統(tǒng)內核的一個重要功能,負責管理物理內存和磁盤上的交換空間。以下是對Linux下如何管理虛擬
    的頭像 發(fā)表于 12-04 09:19 ?1341次閱讀

    路由器內存使用率過高怎么辦

    路由器內存使用率過高是一個常見的問題,它可能會導致網(wǎng)絡速度變慢、連接不穩(wěn)定甚至設備崩潰。 路由器內存的作用和重要性 路由器是網(wǎng)絡通信的核心設備,負責將數(shù)據(jù)包從一個網(wǎng)絡傳輸?shù)搅硪粋€網(wǎng)絡。路由器內存
    的頭像 發(fā)表于 10-15 14:36 ?3562次閱讀

    信號噪聲太大怎么辦

    我用一個TMR磁場傳感器,后面接一個儀表放大器,測出來的信號的噪聲特別大,如圖所示。這種情況怎么辦
    發(fā)表于 09-06 11:09

    內存管理的硬件結構

    常見的內存分配函數(shù)有malloc,mmap等,但大家有沒有想過,這些函數(shù)在內核中是怎么實現(xiàn)的?換句話說,Linux內核內存管理是怎么實現(xiàn)的
    的頭像 發(fā)表于 09-04 14:28 ?661次閱讀
    <b class='flag-5'>內存</b>管理的硬件結構

    linux驅動程序如何加載進內核

    Linux系統(tǒng)中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現(xiàn)對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是Linux驅動開發(fā)的基礎。在編
    的頭像 發(fā)表于 08-30 15:02 ?1104次閱讀

    ddos造成服務器癱瘓后怎么辦

    在服務器遭受DDoS攻擊后,應立即采取相應措施,包括加強服務器安全、使用CDN和DDoS防御服務來減輕攻擊的影響。rak小編為您整理發(fā)布ddos造成服務器癱瘓后怎么辦。
    的頭像 發(fā)表于 08-15 10:08 ?522次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統(tǒng)的核心部分,負責管理硬件資源和提供系統(tǒng)調用接口。隨著 Linux 內核的不斷發(fā)展和更新,其復雜性和代碼規(guī)
    的頭像 發(fā)表于 08-13 13:42 ?1313次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發(fā)表于 08-07 15:51 ?641次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    大電流一體成型電感有噪音怎么辦

    電子發(fā)燒友網(wǎng)站提供《大電流一體成型電感有噪音怎么辦.docx》資料免費下載
    發(fā)表于 07-30 12:30 ?0次下載

    如何檢測內存泄漏

    檢測內存泄漏是軟件開發(fā)過程中一項至關重要的任務,它有助于識別和解決那些導致程序占用過多內存資源,從而影響程序性能甚至導致程序崩潰的問題。以下將詳細闡述幾種常見的內存
    的頭像 發(fā)表于 07-30 11:50 ?3507次閱讀