天天看點

free 檢視系統記憶體使用情況

原文位址 https://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html

free 工具用來檢視系統可用記憶體:

解釋一下 Linux 上 free 指令的輸出。

下面是 free 的運作結果,一共有 4 行。為了友善說明,我加上了列号。這樣可以把 free 的輸出看成一個二維數組 FO(Free Output)。例如:

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 的記憶體。在有些時候 buffer 和 cache 這兩個詞經常混用。不過在一些比較低層的軟體裡是要區分這兩個詞的,看老外的洋文:

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

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

釋放掉被系統 cache 占用的資料:

讀一個大檔案,并記錄時間;

關閉該檔案;

重讀這個大檔案,并記錄時間;

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

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

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

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

因為被系統 cache 和 buffer 占用的記憶體可以被快速回收,是以通常 FO[3][3] 比 FO[2][3] 會大很多。

這裡還用兩個等式:

這二者都不難了解。

free 指令由 procps.*.rpm 提供(在 Redhat 系列的 OS 上)。free 指令的所有輸出值都是從 / proc/meminfo 中讀出的。

在系統上可能有 meminfo(2) 這個函數,它就是為了解析 / proc/meminfo 的。procps 這個包自己實作了 meminfo() 這個函數。可以下載下傳一個 procps 的 tar 包看看具體實作,現在最新版式 3.2.8。

繼續閱讀