linux free 命令

free 命令顯示系統內存的使用狀況,包括物理內存、交換內存(swap)和內核緩衝區內存。linux

若是加上 -h 選項,輸出的結果會友好不少:ubuntu

有時咱們須要持續的觀察內存的情況,此時可使用 -s 選項並指定間隔的秒數:緩存

$ free -h -s 3

上面的命令每隔 3 秒輸出一次內存的使用狀況,直到你按下 ctrl + c。
(Ubuntu 16.04 中默認的 free 版本有 bug,使用 -s 選項時報錯,因此這張圖是在 CentOS 中截的。)app

因爲 free 命令自己比較簡單,因此本文的重點會放在如何經過 free 命令瞭解系統當前的內存使用情況。性能

輸出簡介

下面先解釋一下輸出的內容:
Mem 行(第二行)是內存的使用狀況。
Swap 行(第三行)是交換空間的使用狀況。
total 列顯示系統總的可用物理內存和交換空間大小。
used 列顯示已經被使用的物理內存和交換空間。
free 列顯示還有多少物理內存和交換空間可用使用。
shared 列顯示被共享使用的物理內存大小。
buff/cache 列顯示被 buffer 和 cache 使用的物理內存大小。
available 列顯示還能夠被應用程序使用的物理內存大小。spa

我想只有在理解了一些基本概念以後,上面的輸出才能幫助咱們瞭解系統的內存情況。操作系統

buff/cache

先來提一個問題: buffer 和 cache 應該是兩種類型的內存,可是 free 命令爲何會把它們放在一塊兒呢?要回答這個問題須要咱們作些準備工做。讓咱們先來搞清楚 buffer 與 cache 的含義。翻譯

buffer 在操做系統中指 buffer cache, 中文通常翻譯爲 "緩衝區"。要理解緩衝區,必須明確另外兩個概念:"扇區" 和 "塊"。扇區是設備的最小尋址單元,也叫 "硬扇區" 或 "設備塊"。塊是操做系統中文件系統的最小尋址單元,也叫 "文件塊" 或 "I/O 塊"。每一個塊包含一個或多個扇區,但大小不能超過一個頁面,因此一個頁能夠容納一個或多個內存中的塊。當一個塊被調入內存時,它要存儲在一個緩衝區中。每一個緩衝區與一個塊對應,它至關因而磁盤塊在內存中的表示(下圖來自互聯網):3d

注意,buffer cache 只有塊的概念而沒有文件的概念,它只是把磁盤上的塊直接搬到內存中而不關心塊中究竟存放的是什麼格式的文件。code

cache 在操做系統中指 page cache,中文通常翻譯爲 "頁高速緩存"。頁高速緩存是內核實現的磁盤緩存。它主要用來減小對磁盤的 I/O 操做。具體地講,是經過把磁盤中的數據緩存到物理內存中,把對磁盤的訪問變爲對物理內存的訪問。頁高速緩存緩存的是內存頁面。緩存中的頁來自對普通文件、塊設備文件(這個指的就是 buffer cache 呀)和內存映射文件的讀寫
頁高速緩存對普通文件的緩存咱們能夠這樣理解:當內核要讀一個文件(好比 /etc/hosts)時,它會先檢查這個文件的數據是否是已經在頁高速緩存中了。若是在,就放棄訪問磁盤,直接從內存中讀取。這個行爲稱爲緩存命中。若是數據不在緩存中,就是未命中緩存,此時內核就要調度塊 I/O 操做從磁盤去讀取數據。而後內核將讀來的數據放入頁高速緩存中。這種緩存的目標是文件系統能夠識別的文件(好比 /etc/hosts)。
頁高速緩存對塊設備文件的緩存就是咱們在前面介紹的 buffer cahce。由於獨立的磁盤塊經過緩衝區也被存入了頁高速緩存(緩衝區最終是由頁高速緩存來承載的)。

到這裏咱們應該搞清楚了:不管是緩衝區仍是頁高速緩存,它們的實現方式都是同樣的。緩衝區只不過是一種概念上比較特殊的頁高速緩存罷了。
那麼爲何 free 命令不直接稱爲 cache 而非要寫成 buff/cache? 這是由於緩衝區和頁高速緩存的實現並不是天生就是統一的。在 linux 內核 2.4 中才將它們統一。更早的內核中有兩個獨立的磁盤緩存:頁高速緩存和緩衝區高速緩存。前者緩存頁面,後者緩存緩衝區。當你知道了這些故事以後,輸出中列的名稱可能已經再也不重要了。

free 與 available

在 free 命令的輸出中,有一個 free 列,同時還有一個 available 列。這兩者到底有何區別?
free 是真正還沒有被使用的物理內存數量。至於 available 就比較有意思了,它是從應用程序的角度看到的可用內存數量。Linux 內核爲了提高磁盤操做的性能,會消耗一部份內存去緩存磁盤數據,就是咱們介紹的 buffer 和 cache。因此對於內核來講,buffer 和 cache 都屬於已經被使用的內存。當應用程序須要內存時,若是沒有足夠的 free 內存能夠用,內核就會從 buffer 和 cache 中回收內存來知足應用程序的請求。因此從應用程序的角度來講,available  = free + buffer + cache。請注意,這只是一個很理想的計算方式,實際中的數據每每有較大的偏差。

交換空間(swap space)

swap space 是磁盤上的一塊區域,能夠是一個分區,也能夠是一個文件。因此具體的實現能夠是 swap 分區也能夠是 swap 文件。當系統物理內存吃緊時,Linux 會將內存中不常訪問的數據保存到 swap 上,這樣系統就有更多的物理內存爲各個進程服務,而當系統須要訪問 swap 上存儲的內容時,再將 swap 上的數據加載到內存中,這就是常說的換出和換入。交換空間能夠在必定程度上緩解內存不足的狀況,可是它須要讀寫磁盤數據,因此性能不是很高。

如今的機器通常都不太缺內存,若是系統默認仍是使用了 swap 是否是會拖累系統的性能?理論上是的,但實際上可能性並非很大。而且內核提供了一個叫作 swappiness 的參數,用於配置須要將內存中不經常使用的數據移到 swap 中去的緊迫程度。這個參數的取值範圍是 0~100,0 告訴內核儘量的不要將內存數據移到 swap 中,也即只有在無可奈何的狀況下才這麼作,而 100 告訴內核只要有可能,儘可能的將內存中不常訪問的數據移到 swap 中。在 ubuntu 系統中,swappiness 的默認值是 60。若是咱們覺着內存充足,能夠在 /etc/sysctl.conf 文件中設置 swappiness:

vm.swappiness=10

若是系統的內存不足,則須要根據物理內存的大小來設置交換空間的大小。具體的策略網上有很豐富的資料,這裏筆者再也不贅述。

/proc/meminfo 文件

其實 free 命令中的信息都來自於 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起來不太直觀:

$ cat /proc/meminfo

有興趣的同窗能夠直接查看這個文件。

總結

free 命令是一個既簡單又複雜的命令。簡單是由於這個命令的參數少,輸出結果清晰。說它複雜則是由於它背後是比較晦澀的操做系統中的概念,若是不清楚這些概念,即使看了 free 命令的輸出也 get 不到多少有價值的信息。

相關文章
相關標籤/搜索