Linux 內存分析工具——free命令


Linux系統經常被用作服務器系統。當服務器內存吃緊的時候,free命令是我們最常使用的內存分析工具。

free使用介紹

free命令可以顯示Linux系統中空閑的、已用的物理內存及swap內存,及被內核使用的buffer。在Linux系統監控的工具中,free命令是最經常使用的命令之一。

free命令使用起來非常簡單。

# 命令格式
free [參數]
# 可選參數
-b  以Byte為單位顯示內存使用情況。 
-k  以KB為單位顯示內存使用情況。 
-m  以MB為單位顯示內存使用情況。
-g   以GB為單位顯示內存使用情況。
-h   根據內存大小自動選擇合適的單位顯示
-o  不顯示緩沖區調節列。 
-s<間隔秒數>  持續觀察內存使用狀況。
-c<顯示次數>   和-s配合使用
-t  顯示內存總和列。 
-V  顯示版本信息。

下面列舉一個我最常用的命令格式

#顯示所有的內存信息,每隔兩秒顯示一次,一共顯示兩次
free -h -s 2 -c 2

輸出顯示如下

             total       used       free     shared    buffers     cached  available
Mem:          6.6G       5.5G       1.0G       1.1M       247M       3.5G         0B
-/+ buffers/cache:       1.8G       4.8G 
Swap:         5.0G       106M       4.9G 

下面對這些參數做下說明。

free輸出參數說明

先對上面紅框中的數據做下說明。Men表示具體的物理內存,free從多個維度統計了物理內存的情況,每個維度的含義如下:

  • total:總計物理內存的大小。
  • used:已使用的物理內存的大小。
  • free:可用物理內存有多少。
  • shared:多個進程共享的內存總額。
  • buffers:寫入磁盤內存緩沖區的大小(經常進行磁盤IO的效率比較低,所以先將要寫入磁盤的文件進行一定數量的緩沖,等緩沖數據到達一定大小是一次性寫進磁盤,提升效率)
  • cached:從磁盤中讀取內容的緩存大小(原理差不多)。
  • available:下面會介紹。

  • -buffers/cache:表示被程序實實在在吃掉的內存,比如上圖中used內存是5.5G,但是真正被應用程序使用的內存才1.8G,其他被占據的內存主要用來cache數據了,也就是上面的3.5G。
  • +buffers/cache:表示應用程序還可以可以申請的內存總數。

上圖中最后一行是swap分區的使用情況,下面會詳細介紹。

free參數和available參數的區別

在 free 命令的輸出中,有一個 free 列,同時還有一個 available 列。這二者到底有何區別?

free 是真正尚未被使用的物理內存數量。至於 available 就比較有意思了,它是從應用程序的角度看到的可用內存數量。Linux 內核為了提升磁盤操作的性能,會消耗一部分內存去緩存磁盤數據,就是我們介紹的 buffer 和 cache。所以對於內核來說,buffer 和 cache 都屬於已經被使用的內存。當應用程序需要內存時,如果沒有足夠的 free 內存可以用,內核就會從 buffer 和 cache 中回收內存來滿足應用程序的請求。所以從應用程序的角度來說,available = free + buffer + cache。請注意,這只是一個很理想的計算方式,實際中的數據往往有較大的誤差。

但是上面的available參數為什么輸出是0呢?請看官方文檔的說明

The -a switch shows the available memory (if supported by the running kernel and enabled with sysctl -w vm.meminfo_legacy_layout=0 ; shows zero when unsupported or disabled). The produced output is wider than 80 characters.

這個參數的輸出需要操作系統內核支持,如果內核不支持的話就固定輸出一個0。

交換空間(swap space)

swap space 是磁盤上的一塊區域,可以是一個分區,也可以是一個文件。所以具體的實現可以是 swap 分區也可以是 swap 文件。當系統物理內存吃緊時(所謂的吃緊,應該是指當釋放了Cache和Buffer的內存,內存還是不夠用~),Linux 會將內存中不常訪問的數據保存到 swap 上,這樣系統就有更多的物理內存為各個進程服務,而當系統需要訪問 swap 上存儲的內容時,再將 swap 上的數據加載到內存中,這就是常說的換出和換入。交換空間可以在一定程度上緩解內存不足的情況,但是它需要讀寫磁盤數據,所以性能不是很高。

現在的機器一般都不太缺內存,如果系統默認還是使用了 swap 是不是會拖累系統的性能?理論上是的,但實際上可能性並不是很大。並且內核提供了一個叫做 swappiness 的參數,用於配置需要將內存中不常用的數據移到 swap 中去的緊迫程度。這個參數的取值范圍是 0~100,0 告訴內核盡可能的不要將內存數據移到 swap 中,也即只有在迫不得已的情況下才這么做,而 100 告訴內核只要有可能,盡量的將內存中不常訪問的數據移到 swap 中。在 ubuntu 系統中,swappiness 的默認值是 60。如果我們覺着內存充足,可以在 /etc/sysctl.conf 文件中設置 swappiness:

vm.swappiness=10

如果系統的內存不足,則需要根據物理內存的大小來設置交換空間的大小。

參考


免責聲明!

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



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