本文首發於個人公衆號 CloudDeveloper(ID: cloud_dev),專一於乾貨分享,號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。
前面咱們已經學習了 CPU 篇,這篇來看下內存篇。算法
一樣在分析內存以前,咱們得知到怎麼查看系統內存信息,有如下幾種方法。編程
這個文件記錄着比較詳細的內存配置信息,使用 cat /proc/meminfo
查看。緩存
咱們比較關心的是下面幾個字段:網絡
上面信息沒有 MemUsed 的值,雖然能夠用現有的值大體估算出來,可是咱們想一步到位,就用下面的 free 命令。app
這個命令估計用的人就多了(我通常都是用這個命令)。ide
這裏存在一個計算公式:工具
MemTotal = used + free + buff/cache(單位 K)
幾個字段和上面 /proc/meminfo
的字段是對應的。還有個 shared
字段,這個是多進程的共享內存空間,不經常使用。學習
咱們注意到 free 很小,buff/cache 卻很大,這是 Linux 的內存設計決定的,Linux 的想法是內存閒着反正也是閒着,不如拿出來作系統緩存和緩衝區,提升數據讀寫的速率。可是當系統內存不足時,buff/cache 會讓出部分來,很是靈活的操做。雲計算
要看比較直觀的值,能夠加 -h 參數:spa
一樣可使用這個命令,對於內存,可使用 dmidecode -t memory
查看:
這個命令也是很是經常使用了。但對於內存,顯示信息有限。它更可能是用於進行系統全局分析和 CPU 分析。詳細能夠看 CPU 分析一文。
最經常使用的兩個命令 ps 和 top,雖然很簡單的兩個命令,但仍是有很多學問的。
top 命令運行時默認是按照 CPU 利用率進行排序的,若是要按照內存排序,該怎麼操做呢?兩種方法,一種直接按 「M」(相應的按 「P」 是 CPU),另一種是在鍵入 top 以後,按下 「F」,而後選擇要排序的字段,再按下 「s」 確認便可。
能夠看到,我按照 「%MEM」 排序的結果。這個結果對於查看系統佔用內存較多的哪些進程是比較有用的。
而後這裏咱們會重點關注幾個地方,上面橫排區,和前面幾個命令同樣能夠查看系統內存信息,中間標註的橫條部分,和內存相關的有三個字段:VIRT、RES、SHR。
ps 一樣能夠查看進程佔用內存狀況,通常經常使用來查看 Top n 進程佔用內存狀況,如:ps aux --sort=rss | head -n
,表示按 rss 排序,取 Top n。
這裏也關注三個字段:
這個命令用於查看進程的內存映像信息,可以查看進程在哪些地方用了多少內存。 經常使用 pmap -x pid
來查看。
能夠看到該進程內存被哪些庫、哪些文件所佔用,據此咱們定位程序對內存的使用。
幾個字段介紹一下:
最後的 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++編程技術等內容,歡迎你們關注。