http://blog.csdn.net/wwww1988600/article/details/20545969node
解釋一下Linux上free命令的輸出。windows
下面是free的運行結果,一共有4行。爲了方便說明,我加上了列號。這樣能夠把free的輸出當作一個二維數組FO(Free Output)。例如:數組
FO[2][1] = 15402628 FO[3][2] = 12033012緩存
free的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。函數
free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用狀況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。性能
第一行的輸出時從操做系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:測試
這裏獲得第一個等式:this
FO[2][4]表示被幾個進程共享的內存的,如今已經deprecated,其值老是0(固然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。操作系統
FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。在有些時候buffer和cache這兩個詞常常混用。不過在一些比較低層的軟件裏是要區分這兩個詞的,看 老外的洋文:.net
也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這兩者是爲了提升IO性能的,並由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輸出的第二行是從一個應用程序的角度看系統內存的使用狀況。
由於被系統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。
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
說明,釋放前最好sync一下,防止丟數據。
由於LINUX的內核機制,通常狀況下不須要特地去釋放已經使用的cache。這些cache起來的內容能夠增長文件以及的讀寫速度。
有關/proc/sys/vm/drop_caches的用法在下面進行了說明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches. Because this is a non-destructive operation and dirty objects