對LINUX裏面的free命令做個總結,好吧,其實真正原因是最近面試反覆被問,而自己又知道的不是很清楚
free指令會顯示內存的使用情況,包括實體內存,虛擬的交換文件內存,共享內存區段,以及系統核心使用的緩衝區等
首先free --help 查看一下free命令的可選參數:
Usage: free [options] Options: -b, --bytes //以Byte爲單位顯示內存使用情況 -k, --kilo //以KB爲單位顯示內存使用情況 -m, --mega //以MB爲單位顯示內存使用情況 -g, --giga //以MB爲單位顯示內存使用情況 --tera -o //不顯示緩衝區調節列(centos7.2有這個選項) -h, --human //以人類可讀的方式輸出(即帶有單位) --si //使用的進製爲1000而不是1024 -l, --lohi //顯示詳細的低和高內存統計信息 -t, --total //顯示總的內存 -s N, --seconds N //<間隔秒數> 持續觀察內存使用情況 -c N, --count N //觀察接下來n秒內的每一秒的內存使用情況 -V, --version //顯示版本信息
一下文章引用自http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.htm
下面是free的運行結果,一共有4行。爲了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數組FO(Free Output)。例如:
FO[2][1] = 24677460
FO[3][2] = 10321516
free的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。
free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。
第二行的輸出是從操作系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:
24677460KB(缺省時free的單位爲KB)物理內存,即FO[2][1];
在這些物理內存中有23276064KB(即FO[2][2])被使用了;
還用1401396KB(即FO[2][3])是可用的;
這裏得到第一個等式:
FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被幾個進程共享的內存的,現在已經deprecated,其值總是0(當然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。
FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。
那buffers和cached都是緩存,兩者有什麼區別呢?
爲了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間。
磁盤的操作有邏輯級(文件系統)和物理級(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級數據的。
Page cache實際上是針對文件系統的,是文件的緩存,在文件層面上的數據會緩存到page cache。文件的邏輯層需要映射到實際的物理磁盤,這種映射關係由文件系統來完成。當page cache的數據需要刷新時,page cache中的數據交給buffer cache,因爲Buffer Cache就是緩存磁盤塊的。但是這種處理在2.6版本的內核之後就變的很簡單了,沒有真正意義上的cache操作。
Buffer cache是針對磁盤塊的緩存,也就是在沒有文件系統的情況下,直接對磁盤進行操作的數據會緩存到buffer cache中,例如,文件系統的元數據都會緩存到buffer cache中。
簡單說來,page cache用來緩存文件數據,buffer cache用來緩存磁盤數據。在有文件系統的情況下,對文件操作,那麼數據會緩存到page cache,如果直接採用dd等工具對磁盤進行讀寫,那麼數據會緩存到buffer cache。
第三行是從一個應用程序的角度看系統內存的使用情況。
對於FO[3][2],即-buffers/cache,表示一個應用程序認爲系統被用掉多少內存;
對於FO[3][3],即+buffers/cache,表示一個應用程序認爲系統還有多少內存;
因爲被系統cache和buffer佔用的內存可以被快速回收,所以通常FO[3][3]比FO[2][3]會大很多。
這裏還用兩個等式:
FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
這二者都不難理解。
free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有輸出值都是從/proc/meminfo中讀出的。
第四行是交換分區SWAP的,也就是我們通常所說的虛擬內存。
如果機子的swap虛擬內存被用很多,就說明物理內存不夠用