21-套路篇:如何快速找到系統記憶體的問題?
記憶體效能指標
-
系統記憶體指標,比如已用記憶體、剩餘記憶體、共享記憶體、可用記憶體、快取和緩衝區的用量等
-
已用記憶體和剩餘記憶體很容易理解,就是已經使用和還未使用的記憶體
-
共享記憶體是通過tmpfs實現的,所以它的大小也就是tmpfs使用的記憶體大小
tmpfs其實也是一種特殊的快取 -
可用記憶體是新程序可以使用的最大記憶體,它包括剩餘記憶體和可回收快取
-
快取包括兩部分,一部分是磁碟讀取檔案的頁快取,用來快取從磁碟讀取的資料,可以加快以後再次訪問的速度
另一部分,則是Slab分配器中的可回收記憶體 -
緩衝區是對原始磁碟塊的臨時儲存,用來快取將要寫入磁碟的資料
核心就可以把分散的寫集中起來,統一優化磁碟寫入
-
-
程序記憶體指標,比如程序的虛擬記憶體、常駐記憶體、共享記憶體以及Swap記憶體等
常駐記憶體一般會換算成佔系統總記憶體的百分比,也就是程序的記憶體使用率-
虛擬記憶體,包括了程序程式碼段、資料段、共享記憶體、已經申請的堆記憶體和已經換出的記憶體等
已經申請的記憶體,即使還沒有分配實體記憶體,也算作虛擬記憶體 -
常駐記憶體是程序實際使用的實體記憶體,它不包括Swap和共享記憶體
-
共享記憶體,既包括與其他程序共同使用的真實的共享記憶體,還包括了載入的動態連結庫以及程式的程式碼段等
-
Swap記憶體,是指通過Swap換出到磁碟的記憶體
-
缺頁異常,系統呼叫記憶體分配請求後,並不會立刻為其分配實體記憶體,而是在請求首次訪問時,通過缺頁異常來分配
缺頁異常又分為下面兩種場景(主缺頁異常升高,就意味著需要磁碟I/O,那麼記憶體訪問也會慢很多)- 可以直接從實體記憶體中分配時,被稱為次缺頁異常
- 需要磁碟 I/O 介入(比如Swap)時,被稱為主缺頁異常
-
-
Swap的使用情況,比如Swap的已用空間、剩餘空間、換入速度和換出速度等
-
已用空間和剩餘空間就是已經使用和沒有使用的記憶體空間
-
換入和換出速度,則表示每秒鐘換入和換出記憶體的大小
-
記憶體效能工具
從記憶體指標出發
從效能工具出發
如何迅速分析記憶體的效能瓶頸
為了迅速定位記憶體問題,通常會先執行幾個覆蓋面比較大的效能工具,比如free、top、vmstat、pidstat等
- 先用free和top,檢視系統整體的記憶體使用情況
- 再用vmstat和pidstat,檢視一段時間的趨勢,從而判斷出記憶體問題的型別
- 最後進行詳細分析,比如記憶體分配分析、快取/緩衝區分析、具體程序的記憶體使用分析等
例子1
當通過free發現大部分記憶體都被快取佔用後
可以使用vmstat或者sar觀察一下快取的變化趨勢
確認快取的使用是否還在繼續增大
如果繼續增大,則說明導致快取升高的程序還在執行,
那就能用快取/緩衝區分析工具(cachetop、slabtop等),分析這些快取到底被哪裡佔用
例子2
當free一下,發現系統可用記憶體不足時,首先要確認記憶體是否被快取/緩衝區佔用
排除快取/緩衝區後,可以繼續用pidstat或者top,定位佔用記憶體最多的程序
找出程序後,再通過程序記憶體空間工具(比如pmap),分析程序地址空間中記憶體的使用情況就可以了
例子3
當通過vmstat或者sar發現記憶體在不斷增長後,可以分析中是否存在記憶體洩漏的問題
可以使用記憶體分配分析工具memleak ,檢查是否存在記憶體洩漏。如果存在記憶體洩漏問題
memleak會輸出記憶體洩漏的程序以及呼叫堆疊
小結
記憶體調優最重要的就是,保證應用程式的熱點資料放到記憶體中,並儘量減少換頁和交換
常見的優化思路有這麼幾種
- 最好禁止Swap。如果必須開啟Swap,降低swappiness的值,減少記憶體回收時Swap的使用傾向
- 減少記憶體的動態分配。比如可以使用記憶體池、大頁(HugePage)等
- 儘量使用快取和緩衝區來訪問資料
比如,可以使用堆疊明確宣告記憶體空間,來儲存需要快取的資料
或者用Redis這類的外部快取元件,優化資料的訪問 - 使用cgroups等方式限制程序的記憶體使用情況
這樣,可以確保系統記憶體不會被異常程序耗盡 - 通過/proc/pid/oom_adj ,調整核心應用的oom_score
這樣,可以保證即使記憶體緊張,核心應用也不會被OOM殺死
轉載請註明出處喲~ https://www.cnblogs.com/lichengguo