【轉】一文掌握 Linux 性能分析之內存篇
前面我們已經學習了 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
這個命令估計用的人就多了(我一般都是用這個命令)。
這裏存在一個計算公式:
CopyMemTotal = 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
這樣只顯示最後一行,循環顯示最後一行,達到監控該進程的目的。使用:
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 性能分析之內存篇