1. 程式人生 > >【轉】一文掌握 Linux 性能分析之內存篇

【轉】一文掌握 Linux 性能分析之內存篇

進程 gpo 技術 vmstat itl top n post attr 分析

前面我們已經學習了 CPU 篇,這篇來看下內存篇。

01 內存信息

同樣在分析內存之前,我們得知到怎麽查看系統內存信息,有以下幾種方法。

1.1 /proc/meminfo

這個文件記錄著比較詳細的內存配置信息,使用 cat /proc/meminfo 查看。

技術分享圖片

我們比較關心的是下面幾個字段:

  • MemTotal:系統總內存,由於 BIOS、內核等會占用一些內存,所以這裏和配置聲稱的內存會有一些出入,比如我這裏配置有 2G,但其實只有 1.95G 可用。
  • MemFree:系統空閑內存。
  • MemAvailable:應用程序可用內存。有人會比較奇怪和 MemFree 的區別,可以從兩個層面來區分,MemFree 是系統層面的,而 MemAvailable 是應用程序層面的。系統中有些內存雖然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 這些內存,這部分可以回收的內存加上 MemFree 才是 MemAvailable 的內存值,這是內核通過特定算法算出來的,是一個估算值。
  • Buffers:緩沖區內存
  • Cached:緩存

上面信息沒有 MemUsed 的值,雖然可以用現有的值大致估算出來,但是我們想一步到位,就用下面的 free 命令。

1.2 free

這個命令估計用的人就多了(我一般都是用這個命令)。

技術分享圖片

這裏存在一個計算公式:

Copy
MemTotal = used + free + buff/cache(單位 K)

幾個字段和上面 /proc/meminfo 的字段是對應的。還有個 shared 字段,這個是多進程的共享內存空間,不常用。

我們註意到 free 很小,buff/cache 卻很大,這是 Linux 的內存設計決定的,Linux 的想法是內存閑著反正也是閑著,不如拿出來做系統緩存和緩沖區,提高數據讀寫的速率。但是當系統內存不足時,buff/cache 會讓出部分來,非常靈活的操作。

要看比較直觀的值,可以加 -h 參數:

技術分享圖片

1.3 dmidecode

同樣可以使用這個命令,對於內存,可以使用 dmidecode -t memory 查看:

技術分享圖片

1.4 vmstat

這個命令也是非常常用了。但對於內存,顯示信息有限。它更多是用於進行系統全局分析和 CPU 分析。詳細可以看 CPU 分析一文。

技術分享圖片

02 進程內存使用情況分析

最常用的兩個命令 ps 和 top,雖然很簡單的兩個命令,但還是有不少學問的。

2.1 top/htop

top 命令運行時默認是按照 CPU 利用率進行排序的,如果要按照內存排序,該怎麽操作呢?兩種方法,一種直接按 “M”(相應的按 “P” 是 CPU),另外一種是在鍵入 top 之後,按下 “F”,然後選擇要排序的字段,再按下 “s” 確認

即可。

技術分享圖片

可以看到,我按照 “%MEM” 排序的結果。這個結果對於查看系統占用內存較多的哪些進程是比較有用的。

然後這裏我們會重點關註幾個地方,上面橫排區,和前面幾個命令一樣可以查看系統內存信息,中間標註的橫條部分,和內存相關的有三個字段:VIRT、RES、SHR。

  • VIRT:virtual memory usage,進程占用的虛擬內存大小。
  • RES:resident memory usage,進程常駐內存大小,也就是實際內存占用情況,一般我們看進程占用了多少內存,就是看的這個值。
  • SHR:shared memory,共享內存大小,不常用。

2.2 ps

ps 同樣可以查看進程占用內存情況,一般常用來查看 Top n 進程占用內存情況,如:
ps aux --sort=rss | head -n,表示按 rss 排序,取 Top n。

技術分享圖片

這裏也關註三個字段:

  • %MEM:進程使用物理內存所占百分比。
  • VSZ:進程使用虛擬內存大小。
  • RSS:進程使用物理內存大小,我們會重點關註這個值。

2.3 pmap

這個命令用於查看進程的內存映像信息,能夠查看進程在哪些地方用了多少內存。 常用 pmap -x pid 來查看。

技術分享圖片
技術分享圖片

可以看到該進程內存被哪些庫、哪些文件所占用,據此我們定位程序對內存的使用。

幾個字段介紹一下:

  • Address:占用內存的文件的內存起始地址。
  • Kbytes:占用內存的字節數。
  • RSS:實際占用內存大小。
  • Dirty:臟頁大小。
  • Mapping:占用內存的文件,[anon] 為已分配的內存,[stack] 為程序堆棧

最後的 total 為統計的總值。我們可以使用 pmap -x pid | tail -1 這樣只顯示最後一行,循環顯示最後一行,達到監控該進程的目的。使用:

Copy
while true; do pmap -x pid | tail -1; sleep 1; done

OK,以上工具都是 Linux 自帶的,當然還有很多高階的工具,比如 atop、memstat 等等,對於內存泄漏有一個比較常用的檢測工具 Valgrind,更多幹貨可以關註我的公眾號

通過以上手段,我們基本上就能定位內存問題所在了,究竟是內存太小,還是進程占用內存太多,有哪些進程占用較多,這些進程又究竟有哪些地方占用較多,這些問題通過以上方法都能解決。

最後簡單總結下,以上不少工具可能有人會犯選擇困難癥了。對於我來說,查看系統內存用 free -h,分析進程內存占用用 ps 或者 top(首選 ps),深入分析選擇 pmap,就醬。

參考:

Linux下查看內存使用情況的多種方法 http://stor.51cto.com/art/201804/570236.htm

【轉】一文掌握 Linux 性能分析之內存篇