Linux free命令詳解

keeptrying發表於2014-02-28

下面是free的執行結果,一共有4行。為了方便說明,我加上了列號。這樣就可以把free的輸出看成一個二維陣列FO(Free Output)。例如:

FO[2][1] = 24677460

FO[3][2] = 10321516

                    1          2          3          4          5          6

1               total       used       free     shared    buffers     cached

2  Mem:      24677460   23276064    1401396          0     870540   12084008

3  -/+ buffers/cache:   10321516   14355944

4  Swap:     25151484     224188   24927296

free的輸出一共有四行。第四行為交換區的資訊,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free)。

free輸出的第二行和第三行是比較令人迷惑的。這兩行都是說明記憶體使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。

第一行的輸出是從作業系統(OS)來看的,也就是說,從OS的角度來看,計算機上一共有:

l   24677460KB(預設時free的單位為KB)實體記憶體,即FO[2][1]

l   在這些實體記憶體中有23276064KB(即FO[2][2])被使用了;

l   還有1401396KB(即FO[2][3])是可用的。

這裡得到第一個等式:

l   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的記憶體。在有些時候buffercache這兩個詞經常混用。不過在一些比較低層的軟體裡是要區分這兩個詞的:

l   A buffer is something that has yet to be written to disk.

l   A cache is something that has been read from the disk and stored for later use.

也就是說buffer是用於存放要輸出到disk(塊裝置)的資料的,而cache是存放從disk上讀出的資料。這二者是為了提高I/O效能的,並由OS管理。

Linux和其他成熟的作業系統(例如Windows),為了提高IO read的效能,總是要多cache一些資料,這也就是為什麼FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。我們可以做一個簡單的測試:

1.釋放掉被系統cache佔用的資料:

   echo 3>/proc/sys/vm/drop_caches

2.讀一個大檔案,並記錄時間;

3.關閉該檔案;

4.重讀這個大檔案,並記錄時間。

第二次讀應該比第一次快很多。原來我做過一個BerkeleyDB的讀操作,大概要讀5G的檔案,幾千萬條記錄。在我的環境上,第二次比第一次大概可以快9倍左右。

free輸出的第二行是從一個應用程式的角度看系統記憶體的使用情況。

l   對於FO[3][2],即-buffers/cache,表示一個應用程式認為系統被用掉多少記憶體;

l   對於FO[3][3],即+buffers/cache,表示一個應用程式認為系統還有多少記憶體;

因為被系統cachebuffer佔用的記憶體可以被快速回收,所以通常FO[3][3]FO[2][3]會大很多。

這裡還有兩個等式:

l   FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]

l   FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

這二者都不難理解。

free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有輸出值都是從/proc/meminfo讀出的。在系統上可能有meminfo(2)這個函式,它就是為了解析/proc/meminfo的。procps這個包自己實現了meminfo()這個函式。

常用引數:

-b:以Byte為單位顯示記憶體使用情況;

-k:以KB為單位顯示記憶體使用情況;

-m:以MB為單位顯示記憶體使用情況。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25744374/viewspace-1097147/,如需轉載,請註明出處,否則將追究法律責任。