1. 程式人生 > 其它 >21-套路篇:如何快速找到系統記憶體的問題?

21-套路篇:如何快速找到系統記憶體的問題?





記憶體效能指標

  1. 系統記憶體指標,比如已用記憶體、剩餘記憶體、共享記憶體、可用記憶體、快取和緩衝區的用量等

    1. 已用記憶體和剩餘記憶體很容易理解,就是已經使用和還未使用的記憶體

    2. 共享記憶體是通過tmpfs實現的,所以它的大小也就是tmpfs使用的記憶體大小
      tmpfs其實也是一種特殊的快取

    3. 可用記憶體是新程序可以使用的最大記憶體,它包括剩餘記憶體和可回收快取

    4. 快取包括兩部分,一部分是磁碟讀取檔案的頁快取,用來快取從磁碟讀取的資料,可以加快以後再次訪問的速度
      另一部分,則是Slab分配器中的可回收記憶體

    5. 緩衝區是對原始磁碟塊的臨時儲存,用來快取將要寫入磁碟的資料
      核心就可以把分散的寫集中起來,統一優化磁碟寫入


  2. 程序記憶體指標,比如程序的虛擬記憶體、常駐記憶體、共享記憶體以及Swap記憶體等
    常駐記憶體一般會換算成佔系統總記憶體的百分比,也就是程序的記憶體使用率

    1. 虛擬記憶體,包括了程序程式碼段、資料段、共享記憶體、已經申請的堆記憶體和已經換出的記憶體等
      已經申請的記憶體,即使還沒有分配實體記憶體,也算作虛擬記憶體

    2. 常駐記憶體是程序實際使用的實體記憶體,它不包括Swap和共享記憶體

    3. 共享記憶體,既包括與其他程序共同使用的真實的共享記憶體,還包括了載入的動態連結庫以及程式的程式碼段等

    4. Swap記憶體,是指通過Swap換出到磁碟的記憶體

    5. 缺頁異常,系統呼叫記憶體分配請求後,並不會立刻為其分配實體記憶體,而是在請求首次訪問時,通過缺頁異常來分配
      缺頁異常又分為下面兩種場景(主缺頁異常升高,就意味著需要磁碟I/O,那麼記憶體訪問也會慢很多)

      1. 可以直接從實體記憶體中分配時,被稱為次缺頁異常
      2. 需要磁碟 I/O 介入(比如Swap)時,被稱為主缺頁異常

  3. Swap的使用情況,比如Swap的已用空間、剩餘空間、換入速度和換出速度等

    1. 已用空間和剩餘空間就是已經使用和沒有使用的記憶體空間

    2. 換入和換出速度,則表示每秒鐘換入和換出記憶體的大小






記憶體效能工具

從記憶體指標出發



從效能工具出發




如何迅速分析記憶體的效能瓶頸

為了迅速定位記憶體問題,通常會先執行幾個覆蓋面比較大的效能工具,比如free、top、vmstat、pidstat等

  1. 先用free和top,檢視系統整體的記憶體使用情況
  2. 再用vmstat和pidstat,檢視一段時間的趨勢,從而判斷出記憶體問題的型別
  3. 最後進行詳細分析,比如記憶體分配分析、快取/緩衝區分析、具體程序的記憶體使用分析等

例子1

當通過free發現大部分記憶體都被快取佔用後
可以使用vmstat或者sar觀察一下快取的變化趨勢
確認快取的使用是否還在繼續增大
如果繼續增大,則說明導致快取升高的程序還在執行,
那就能用快取/緩衝區分析工具(cachetop、slabtop等),分析這些快取到底被哪裡佔用


例子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殺死

轉載請註明出處喲~ https://www.cnblogs.com/lichengguo