解釋一下linux上free命令的輸出。
下面是free的執行結果,一共有4行。為了方便說明,我們加上了列號。這樣可以把free的輸出看成乙個二維陣列fo(free output)。例如:
1 2 3 4 5 6 1
total used free shared buffers cached
2mem
:999212
967476
31736
050668
223000
3-/+
buffers
/cache
:693808
305404
4swap
:2048276
154524
1893752
複製**
free的輸出一共有四行,第四行為交換區的資訊,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。
free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明記憶體使用情況的。第一列是總量(free),第二列是使用量(free),第三列是可用量(free)。第一行的輸出時從作業系統(os)來看的。也就是說,從os的角度來看,計算機上一共有:
這裡得到第乙個等式:
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占用的資料;
echo
3>/
proc
/sys/vm
/drop_caches
讀乙個大檔案,並記錄時間;
關閉該檔案;
重讀這個大檔案,並記錄時間;
第二次讀應該比第一次快很多。原來我做過乙個berkeleydb的讀操作,大概要讀5g的檔案,幾千萬條記錄。在我的環境上,第二次讀比第一次大概可以快9倍左右。
free輸出的第二行是從乙個應用程式的角度看系統記憶體的使用情況。
因為被系統cache和buffer占用的記憶體可以被快速**,所以通常fo[3][3]比fo[2][3]會大很多。
這裡還用兩個等式:
這二者都不難理解。
free命令由procps.*.rpm提供(在redhat系列的os上)。free命令的所有輸出值都是從/proc/meminfo中讀出的。
Linux free命令詳解
free命令統計出來的記憶體非常具有迷惑性,現在總結如下 第一部分mem行 total 記憶體總數 7863m userd 已經使用的記憶體使用總數 7039m free 剩餘的記憶體總數 823m share 當前已經廢棄不用的記憶體總數 0 buffers 當前被使用的快取大小 583m cac...
linux free命令詳解
free m total used free shared buffers cached mem 1002 769 232 0 62 421 buffers cache 286 715 swap 1153 0 1153 第一部分mem行 total 記憶體總數 1002m used 已經使用的記憶體...
linux free命令詳解
1 free命令功能 free 命令顯示系統使用和空閒的記憶體情況,包括物理記憶體 互動區記憶體 swap 和核心緩衝區記憶體。共享記憶體將被忽略 2 命令格式 free 引數 3 命令引數 b 以byte為單位顯示記憶體使用情況。k 以kb為單位顯示記憶體使用情況。m 以mb為單位顯示記憶體使用情...