[root@beta-nginx ~]# free -m
total used free shared buffers cached
mem:
15948
5974
9974
0232
2828
-/+ buffers/cache
:2913
13035
swap
:3999
03999
(1)mem行
(2)buffers/cache行
為了方便書寫,我們用(m)代表mem行的資料;用(b)代表buffers/cache行的資料;用(s)代表swap行的資料。
(1)total(m)=used(m)+free(m)
15948=5974+9974
(2)total(m)=used(b)+free(b)
15948=2913+13035
(3)used(m)=buffers(m)+cached(m)+used(b)
5974=232+2828+2913 (後面這個等於5973,基本相等,因為有shared)
(4)free(b)=buffers(m)+cached(m)+free(m)
13035=232+2828+9974 (13034,原因同上)
注:因為buffers和cache其實也是記憶體的一部分,這部分特殊的記憶體是可以**的,甚至如果需要我們還可以將這部分buffers和cache給釋放出來
1、page cahe和buffer cache
page cache實際上是針對檔案系統的,是檔案的快取,在檔案層面上的資料會快取到page cache。檔案的邏輯層需要對映到實際的物理磁碟,這種對映關係由檔案系統來完成。當page cache的資料需要重新整理時,page cache中的資料交給buffer cache,但是這種處理在2.6版本的核心之後就變的很簡單了,沒有真正意義上的cache操作。
buffer cache是針對磁碟塊的快取,也就是在沒有檔案系統的情況下,直接對磁碟進行操作的資料會快取到buffer cache中,例如,檔案系統的元資料都會快取到buffer cache中。
簡單說來,page cache用來快取檔案資料,buffer cache用來快取磁碟資料。在有檔案系統的情況下,對檔案操作,那麼資料會快取到page cache,如果直接採用dd等工具對磁碟進行讀寫,那麼資料會快取到buffer cache。
補充一點,在檔案系統層每個裝置都會分配乙個def_blk_ops的檔案操作方法,這是裝置的操作方法,在每個裝置的inode下面會存在乙個radix tree,這個radix tree下面將會放置快取資料的page頁。這個page的數量將會在top程式的buffer一欄中顯示。如果裝置做了檔案系統,那麼會生成乙個inode,這個inode會分配ext3_ops之類的操作方法,這些方法是檔案系統的方法,在這個inode下面同樣存在乙個radix tree,這裡會快取檔案的page頁,快取頁的數量在top程式的cache一欄進行統計。從上面的分析可以看出,2.6核心中的buffer cache和page cache在處理上是保持一致的,但是存在概念上的差別,page cache針對檔案的cache,buffer是針對磁碟塊資料的cache,僅此而已。
2、cache 和 buffer的區別
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 ; 對於共享記憶體(shared memory),主要用於在unix 環境下不同程序之間共享資料,是程序間通訊的一種方法,一般的應用程式不會申請使用共享記憶體
cache:快取記憶體,是位於cpu與主記憶體間的一種容量較小但速度很高的儲存器。由於cpu的速度遠高於主記憶體,cpu直接從記憶體中訪問資料要等待一定時間週期,cache中儲存著cpu剛用過或迴圈使用的一部分資料,當cpu再次使用該部分資料時可從cache中直接呼叫,這樣就減少了cpu的等待時間,提高了系統的效率。cache又分為一級cache(l1 cache)和二級cache(l2 cache),l1 cache整合在cpu內部,l2 cache早期一般是焊在主機板上,現在也都整合在cpu內部,常見的容量有256kb或512kb l2 cache
它是根據程式的區域性性原理而設計的,就是cpu執行的指令和訪問的資料往往在集中的某一塊,所以把這塊內容放入cache後,cpu就不用在訪問記憶體了,這就提高了訪問速度。當然若cache中沒有cpu所需要的內容,還是要訪問記憶體的
[root@beta-nginx ~]# ll /sys/devices/system/cpu/cpu0/cache/
總用量 0
drwxr-xr-x
2 root root 0
4月 4
17:22
index
0#一級cache中的data和instruction cache
drwxr-xr-x
2 root root 0
4月 4
17:22 index1 #一級cache中的data和instruction cache
drwxr-xr-x
2 root root 0
4月 4
17:22 index2 #二級cache,共享的
drwxr-xr-x
2 root root 0
4月 4
17:22 index3 #**cache,共享的
buffer:緩衝區,乙個用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的區域。通過緩衝區,可以使程序之間的相互等待變少,從而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。
3、free中的buffer和cache (它們都是占用記憶體)基於記憶體的
buffer :作為buffer cache的記憶體,是塊裝置的讀寫緩衝區
cache:作為page cache的記憶體, 檔案系統的cache
如果 cache 的值很大,說明cache住的檔案數很多。如果頻繁訪問到的檔案都能被cache住,那麼磁碟的讀io 必會非常小
如何釋放cache memory
to free pagecache:
echo 1 > /proc/sys
/vm/drop_caches
to free dentries and
inodes:
echo 2 > /proc/sys
/vm/drop_caches
to free pagecache, dentries and
inodes:
echo 3 > /proc/sys
/vm/drop_caches
#注意,釋放前最好sync一下,防止丟失資料,但是一般情況下沒有必要手動釋放記憶體
4、總結
cached是cpu與記憶體間的,buffer是記憶體與磁碟間的,都是為了解決速度不對等的問題
buffer是即將要被寫入磁碟的,而cache是被從磁碟中讀出來的
Linux中的free命令
分類 linux技術 2014 03 05 14 51 8031人閱讀收藏 舉報解釋一下linux上free命令的輸出。下面是free的執行結果,一共有4行。為了方便說明,我加上了列號。這樣可以把free的輸出看成乙個二維陣列fo free output 例如 free的輸出一共有四行,第四行為交換...
Linux中 free 命令詳解
free命令可以用來檢視系統記憶體使用情況。我一般習慣 m引數以mb的方式檢視 其他引數解釋 所以,可以供程式使用的記憶體,應該看 buffers cache 而不是free。那明明已經開始使用 swap了,怎麼能說記憶體還充足呢?照我的理解是,系統在分配記憶體的時候,如果發現記憶體不足,會釋放一批...
free命令中buffers與cached的區別
執行free命令後,會顯示buffers和cached選項 free total used free shared buffers cached mem 3085864 2200144 885720 0 595440 1273512 buffers cache 331192 2754672 swap...