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

本文首發於個人公衆號 CloudDeveloper(ID: cloud_dev),專一於乾貨分享,號內有大量書籍和視頻資源,後臺回覆 「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 命令。app

1.2 free

這個命令估計用的人就多了(我通常都是用這個命令)。ide

這裏存在一個計算公式:工具

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

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

咱們注意到 free 很小,buff/cache 卻很大,這是 Linux 的內存設計決定的,Linux 的想法是內存閒着反正也是閒着,不如拿出來作系統緩存和緩衝區,提升數據讀寫的速率。可是當系統內存不足時,buff/cache 會讓出部分來,很是靈活的操做。雲計算

要看比較直觀的值,能夠加 -h 參數:spa

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/201...


個人公衆號 CloudDeveloper(ID: cloud_dev),號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,分享的內容包括但不限於雲計算虛擬化、容器、OpenStack、K8S、霧計算、網絡、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++編程技術等內容,歡迎你們關注。

image

相關文章
相關標籤/搜索