linux命令之free

    對LINUX裏面的free命令做個總結,好吧,其實真正原因是最近面試反覆被問,而自己又知道的不是很清楚j_0009.gif


    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  

wKioL1cc00SjMtYZAAATvs5WCW0614.png

  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虛擬內存被用很多,就說明物理內存不夠用



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章