1. 程式人生 > >Linux效能優化-記憶體效能優化思路

Linux效能優化-記憶體效能優化思路

目錄

記憶體效能指標

記憶體效能工具

如何快速分析記憶體的效能指標


 

記憶體效能指標

系統記憶體使用情況
1.已用記憶體和剩餘記憶體
2.共享記憶體,通過tmpfs實現的,他的大小就是tmpfs使用的記憶體大小,這是一個特殊的快取
3.可用記憶體是新程序可以使用的最大記憶體,包括剩餘記憶體和可回收快取
4.快取包括,從磁碟讀取檔案頁的buffer快取,用來快取從磁碟讀取的資料加速再次訪問
   還包括Slab分歧中的可回收記憶體
5.緩衝區是對原始磁碟塊的臨時儲存,用來快取將要寫入磁碟的資料,核心可以把分散的寫集中起來,統一
   優化磁碟寫入

程序記憶體使用情況
如程序的虛擬記憶體,常駐記憶體,共享記憶體,swap記憶體等
1.虛擬記憶體,包括了程序程式碼段,資料段,共享記憶體,已經申請的堆記憶體和已經換出的記憶體等,注意,已經
  申請的記憶體,即使還沒有分配實體記憶體,也算作虛擬記憶體
2.常駐記憶體是程序實際使用的實體記憶體,不包括swap和共享記憶體,一般會換算成佔系統總記憶體的百分比,
   也就是程序的記憶體使用率
3.共享記憶體,包括與其他程序共同使用的真是的共享記憶體,還包括了載入的動態連結庫以及程式程式碼段等
4.Swap記憶體,是指通過Swap換出到磁碟的記憶體

缺頁異常
系統呼叫記憶體分配請求後,並不會立刻為其分配實體記憶體,而是在首次訪問時,通過缺頁異常來分配,缺頁
  異常包括兩類
1.可以直接從實體記憶體中分配時,稱為次缺頁異常
2.需要磁碟I/O介入,比如Swap時,被成為主缺頁異常,主缺頁異常升高,意味著需要磁碟I/O,會導致
   記憶體訪問變慢很多

Swap的使用情況
如swap的已用空間,剩餘空間,換入速度和換出速度等
1.已用空間和剩餘空間很好理解,就是字面上的意思,已使用和沒有使用的記憶體空間
2.換入和換出速度,則表示每秒鐘換入和換出記憶體的大小
 

記憶體的效能指標相關的思維導圖

 


記憶體效能工具

比如free 檢視整體記憶體和swap情況
top和ps 檢視程序的記憶體情況
在proc中還有很多記憶體指標的來源,如/proc/zoneinfo等
通過vmstat可以動態觀察記憶體變化情況
通過cachestat 檢視整個系統快取的讀寫命中情況
通過cachetop來觀察每個程序快取的讀寫命中情況
memleak檢視記憶體分配,找到記憶體洩露的位置
通過sar也可以實時的檢視記憶體使用情況
 

效能指標和工具聯絡
同CPU一樣,可以從兩個不同維度出發
1.從記憶體指標出發,把工具和工作原理關聯起來
2.從效能工具出發,可以更快的利用工具,找出我們想觀察的效能指標,特別是工具有限的情況下,得充分
   利用手頭的每一個工具,挖掘更多問題

根據指標找工具

從效能工具出發,最大化利用已有的工具,找到想要的指標
根據工具查詢指標(記憶體效能)

 


如何快速分析記憶體的效能指標

在實際環境中,我們希望儘可能快的定位系統瓶頸,然後儘可能快的優化效能,就是要又快又準的效能相關的問題
雖然記憶體效能指標很多,但都是魏了描述記憶體的原理,指標間自然不會完全孤立,一般都會有關聯,反過來說,這些關聯也正是源於系統的記憶體原理
為了快速定位記憶體問題,可以先執行幾個覆蓋面比較大的效能工具,如free,top,vmstat,pidstat等
具體粉絲思路如下
1.先用free和top,檢視系統整體的記憶體使用情況
2.再用vmstat和pidstat,檢視一段時間的趨勢,從而判斷出記憶體的問題型別
3.最後進行詳細分析,比如記憶體分配分析,快取/緩衝區分析,具體程序的記憶體使用分析等

相關流程圖如下

幾個例子
1.當通過free發現大部分記憶體都會快取佔用後,就可以使用vmstat或者sar觀察快取變化趨勢,確認快取的
  使用是否還在繼續增大,如果繼續增大,說明導致快取升高的程序還在執行,再用cachestat和cachetop
  分析這些快取到底被哪裡佔用
2.用free發現可用記憶體不足,首先要確認記憶體是否被快取/緩衝區佔用,排除快取/緩衝區後,可以繼續用
   pidstat或top,定位佔用記憶體最多的程序,找出程序後,再通過程序記憶體空間工具(如pmap)分析
   程序地址空間中記憶體的使用情況
3.當通過vmstat或sar發現記憶體不斷增長,可以分析是否存在記憶體洩露問題,使用memleak檢查是否存在
   記憶體洩露,memleak輸出記憶體洩露的程序以及呼叫堆疊

 


雖然記憶體的效能指標和效能工具都很多,但理解其原理後,會發現他們之間有一定關聯
找到記憶體問題來源後,下一步就是相應的優化工作了,記憶體調優最重要的是,保證應用程式的熱點資料放到記憶體中,並儘量減少換頁和交換
常見的優化思路如下
1.最好禁止Swap,如必須開啟Swap,降低swappiness的值,減少記憶體回收時Swap的使用傾向
2.減少記憶體的動態分配,比如可以使用記憶體池,大頁(HugePage)等
3.儘量使用快取和緩衝區來訪問資料,比如可以使用堆疊明確宣告記憶體空間,來儲存需要快取的資料,或
  用Redis這類的外部快取組建,優化資料的訪問
4.使用cgroups等方式限制程序的記憶體使用情況,這樣可以確保系統記憶體不會被異常程序耗盡
5.通過/proc/[PID]/oom_adj,調整核心應用的oom_score,可以保證及時記憶體緊張,核心應用也不會被OOM
  殺死