1. 程式人生 > >快速定位系統內存問題的思路

快速定位系統內存問題的思路

process 51cto swap top 而是 常用 通過 內存 tmpfs

一、怎麽樣衡量系統內存1、查看系統內存的使用情況,比如已用內存,剩余內存,共享內存,可用內存,緩存和緩沖區的用量。

  • 已用內存和剩余內存,就是已經使用和還未使用的內存。
  • 共享內存,是通過tmpfs來實現的,它的大小就是tmpfs使用的內存大小,tmpfs其實也是一種特殊的緩存。
  • 可用內存,就是新進程可以使用的最大內存,包括剩余內存和可回收內存
  • 緩存,緩存包括磁盤讀取文件的頁緩存和Slab分配器中的可回收內存。頁緩存用來緩存從磁盤讀取的數據。
  • 緩沖區,是對原始磁盤塊的l臨時存儲,用來緩存將要寫入磁盤的數據,這樣內核就可以把分散的寫集中起來,統一優化磁盤寫入。

2、查看進程內存的使用情況,比如進程的虛擬內存,常駐內存,共享內存已經swap內存。

  • 虛擬內存,包括進程的代碼段,數據段,共享內存,已經申請的堆內存和已經換出的內存等。註意:已經申請的內存,即使還沒有分配物理內存,也算作是虛擬內存。
  • 常駐內存,進程實際使用的物理內存,不包括swap和共享內存。
  • 共享內存,它既包括與其他進程共同使用的真實的共享內存,還包括加載的動態鏈接庫和程序的代碼段。
  • swap內存,指通過swap換出到磁盤的內存。
  • 缺頁異常,系統在調用內存分配請求後,並不會立刻為其分配物理內存,而是在請求首次訪問時,通過缺頁異常來分配。缺頁異常分為下面兩種場景:

    1. 通過直接從物理內存分配,稱為次缺頁異常。
    2. 需要磁盤IO接入時,稱為主缺頁異常。

二、內存的性能分析工具

1、更具內存指標找對應的工具

技術分享圖片
2、根據性能工具看內存指標

技術分享圖片
三、定位內存問題為了快速定位內存問題,通常我會先運行幾個覆蓋率比較大的性能工具,比如free,top,vmstat,pidstat具體的思路如下:

  1. 先用free和top查看系統整體d的內存使用情況。
  2. 再用vmstat和pidstat,查看一段時間的趨勢,從而判斷內存問題的類型。
  3. 最後進行詳細分析,比如內存分配分析,緩存/緩沖區分析,具體進程的內存使用分析等。

四、常用優化思路

  1. 最好禁止swap,如果必須開啟swap,降低swapiness的值,減少內存回收時swap的使用傾向。
  2. 減少內存的動態分配,比如可以s使用內存池,大頁(HugePage)等。
  3. 盡量使用緩存和緩沖區來訪問數據,比如,可以使用堆棧明確聲明內存空間,來存儲需要緩存的數據。或者使用redis這類的外部緩存組件,優化數據訪問。
  4. 使用cgroups方式來限制內存使用情況,這樣,可以確保系統內存不會被異常進程耗盡。
  5. 通過/proc/pid/oom_adj,調整核心應用的oom_score,這樣,可以保證即使內存緊張,核心應用也不會被OOM殺死。

快速定位系統內存問題的思路