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


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

前面我們已經學習了 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

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

這里存在一個計算公式:

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 這樣只顯示最后一行,循環顯示最后一行,達到監控該進程的目的。使用:

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雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM