smaps 使用&& 內存泄露


 

   這是一般進程的地址空間划分,現在有個問題,如果進程出現使用較多內存,非常明顯,在不使用valgrind 工具下 能否看出來大概原因??

 top命令我們已經能看出進程的虛擬空間大小(VIRT)、占用的物理內存(RES)以及和其他進程共享的內存(SHR)。但是僅此而已; 但是想知道 更詳細的呢??

/proc/self/maps,基於里面信息能大概判斷泄露的內存的屬性,是哪個區域在泄漏、對應哪個文件。輔助工具procmem輸出更可讀的maps信息。

 參考:https://www.cnblogs.com/arnoldlu/p/10272466.html

 參考:proc-smaps

   在smaps文件中,每一條記錄表示進程虛擬內存空間中一塊連續的區域。其中第一行從左到右依次表示地址范圍、權限標識、映射文件偏移、設備號、inode、文件路徑

 

--00400000-00531000---該虛擬內存段的開始和結束位置
---r-xp內存段的權限,最后一位p代表私有,s代表共享 
---00000000-該虛擬內存段在對應的映射文件中的偏移量
-fc:02---文件的主設備和次設備號--
-687197---被映射到虛擬內存的文件的索引節點號
--/opt/bin/proxy_test--- 被映射到虛擬內存的文件名稱后面帶(deleted)的是內存數據,可以被銷毀
00400000-00531000 r-xp 00000000 fc:02 687197                             /opt/bin/proxy_test
Size:               1220 kB 是進程使用內存空間,並不一定實際分配了內存(VSS)
Rss:                 928 kB 實際分配的內存(不需要缺頁中斷就可以使用的)
Pss:                 894 kB 平攤計算后的使用內存(有些內存會和其他進程共享,例如mmap進來的)
Shared_Clean:         68 kB  RSS中其他進程共享的未改寫頁面
Shared_Dirty:          0 kB RSS中其他進程共享的已改寫頁面
Private_Clean:       860 kB  RSS中未改寫的私有頁面頁面
Private_Dirty:         0 kB RSS中已改寫的私有頁面頁面
Referenced:          928 kB 標記為訪問和使用的內存大小
-----indicates the amount of memory currently marked as referenced or accessed.
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB 內核頁大小 
MMUPageSize:           4 kB MMU頁大小,基本和Kernel頁大小相同
Locked:                0 kB
Anonymous” shows the amount of memory that does not belong to any file. 
Even a mapping associated with a file may contain anonymous pages: when MAP_PRIVATE 
and a page is modified, the file page is replaced by a private anonymous copy 

參考:https://www.modb.pro/db/47525

   目前在處理問題過程中出現 進程內存一直都在增長,但是版本發布前使用valgrind發現沒有出現內存泄漏, 同時是線上環境,目前不能動!

所以只能先將進程的smaps 打印出來;根據smaps的數據 每一個

00400000-00531000 r-xp 00000000 fc:02 687197                     

地址段的情況;根據其特定記錄可能出現問題的地址段!!

然后使用gdb  dump memory 名將此地址段的內存等都 dump到文件dumpres.text中;

然后strings -100  dumpres.text 分析 讀取其字符

根據其內容分析可能有問題的地方

目前根據strings 結果發現有很多tls 相關信息。可能是使用tls 時出現錯誤吧!!!

目前在客戶線程 關閉了https 代理 運行一天后 發現 內存沒有增長, 所以應該 就是ssl/tls 使用不當導致的堆內存泄露

 

 

 

VSS - Virtual Set Size
RSS - Resident Set Size
PSS - Proportional Set Size
USS - Unique Set Size
ASAN - AddressSanitizer
LSAN - LeakSanitizer

 

 

三個進程都需要使用libc的代碼段。
VSS = 1 +2 +3
RSS = 4 +5 +6
PSS= 4/3 + 5/2 + 6 比例化的
USS= 6 獨占且駐留的

工具:smem ,查看進程使用內存的情況。
一般來講,進程使用的內存量,還是看PSS,強調公平性。看內存泄漏看USS 就好了。

內存泄漏 界定和檢測方法

界定:連續多點采樣法,隨着時間越久,進程耗費內存越多。

主要由內存申請和釋放不是成對引起。RSS/USS曲線,

觀察方法:使用smem工具查看多次進程使用內存,USS使用量。

檢查工具:
1、valgrind ,會跑一個虛擬機,運行時檢查進程的內存行為。會放慢程序的速度。不需要重新編譯程序。
2、addressanitizer,需要重新編譯程序。編譯時加參數,-fsanitize
gcc 4.9才支持,只會放慢程序速度2~3倍。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM