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 -ah -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
- +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
如果系統的記憶體不足,則需要根據實體記憶體的大小來設定交換空間的大小。
參考
- https://www.cnblogs.com/peida/archive/2012/12/25/2831814.html
- https://www.cnblogs.com/ultranms/p/9254160.html