自:http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html
Linux上free命令的輸出。
下面是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
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的角度來看,計算機上一共有:
- 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這兩個詞經常混用。不過在一些比較低層的軟件里是要區分這兩個詞的,看老外的洋文:
- A buffer is something that has yet to be "written" to disk.
- A cache is something that has been "read" from the disk and stored for later use.
也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是為了提高IO性能的,並由OS管理。
Linux和其他成熟的操作系統(例如windows),為了提高IO read的性能,總是要多cache一些數據,這也就是為什么FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。
第二行的輸出是從一個應用程序的角度看系統內存的使用情況。
- 對於FO[3][2],即FO[2][2]-buffers/cache,表示一個應用程序認為系統被用掉多少內存;
- 對於FO[3][3],即FO[2][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]
buffer 與cache 的區別
A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.
A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.
兩者都是RAM中的數據。簡單來說,buffer是即將要被寫入磁盤的,cache是被從磁盤中讀出來的。這二者是為了提高IO性能的,並由OS管理,並非應用自己分配的內存,而是OS自己根據需要對空閑內存進行的額外利用。因為這部分只是緩存,降低IO,提升性能,只要應用程序有需要,OS可以直接將buffer寫入磁盤,將cache刪掉來得到空閑內存給應用程序使用。
buffer是用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。緩沖(buffers)是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。
cache經常被用在磁盤的I/O請求上,如果有多個進程都要訪問某個文件,於是該文件便被做成cache以方便下次被訪問,這樣可提供系統性能。緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往后排,直至從中刪除。
buffer是用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。緩沖(buffers)是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。
cache經常被用在磁盤的I/O請求上,如果有多個進程都要訪問某個文件,於是該文件便被做成cache以方便下次被訪問,這樣可提供系統性能。緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往后排,直至從中刪除。
因此:
-/+ buffers/cache的含義即:使用內存是實際當前使用內存減去buffers/cache之和;空閑內存是實際空閑內存加上buffers/cache之和。 所以是-/+
查看空閑內存,確定應用是否有內存泄漏時,只能以Free的第三行為依據,第二行其實作用不大,只是可以看到OS當前的buffer和cache大小。