參考:凌筱的博客
摘要: cache是高速緩存往核,用于CPU和內(nèi)存之間的緩沖瞧栗;buffer是I/O緩存尝蠕,用于內(nèi)存和硬盤的緩沖列肢。
Linux中free顯示內(nèi)存中buffer與cache的區(qū)別
當(dāng)你在linux下頻繁存取文件后,物理內(nèi)存會(huì)很快被用光,當(dāng)程序結(jié)束后,內(nèi)存不會(huì)被正常釋放,而是一直作為caching.
先來(lái)說(shuō)說(shuō)free命令
常用參數(shù)b 以字節(jié)為單位顯示血柳。-k 以KB為單位顯示官册。默認(rèn)顯示。-m 以MB為單位顯示难捌。-s 每隔多少秒重復(fù)執(zhí)行膝宁。可編寫一個(gè)腳本用于監(jiān)控根吁。
[root@ centos ~]# free -m
其中:
total 內(nèi)存總數(shù)
used 已經(jīng)使用的內(nèi)存數(shù)
free 空閑的內(nèi)存數(shù)
shared 多個(gè)進(jìn)程共享的內(nèi)存總額
buffers Buffer Cache和cached Page Cache 磁盤緩存的大小
-buffers/cache 的內(nèi)存數(shù):used - buffers – cached 表示一個(gè)應(yīng)用程序認(rèn)為系統(tǒng)被用掉多少內(nèi)存员淫;
+buffers/cache 的內(nèi)存數(shù):free + buffers + cached表示一個(gè)應(yīng)用程序認(rèn)為系統(tǒng)還有多少內(nèi)存;
可用的memory=free memory+buffers+cached
有了這個(gè)基礎(chǔ)后,可以得知,我現(xiàn)在used為461MB,free為527,buffer為24击敌,cached為188
那么我們來(lái)看看,如果我執(zhí)行復(fù)制文件,內(nèi)存會(huì)發(fā)生什么變化.
[root@ centos ~]# cp -r /etc ~/test/[root@ centos ~]# free -m
在命令執(zhí)行結(jié)束后,used為863MB,free為125MB,buffers為22MB,cached為168MB, cached數(shù)據(jù)明顯增加介返,這是為了提高文件讀取效率的做法.
為了提高磁盤存取效率, Linux做了一些精心的設(shè)計(jì), 除了對(duì)dentry進(jìn)行緩存(用于VFS,加速文件路徑名到inode的轉(zhuǎn)換), 還采取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對(duì)磁盤塊的讀寫沃斤,后者針對(duì)文件inode的讀寫圣蝎。這些Cache有效縮短了 I/O系統(tǒng)調(diào)用(比如read,write,getdents)的時(shí)間。"
那么有人說(shuō)過(guò)段時(shí)間,linux會(huì)自動(dòng)釋放掉所用的內(nèi)存,我們使用free再來(lái)試試,看看是否有釋放?
[root@ centos ~]# free -m
MS沒(méi)有任何變化,那么我能否手動(dòng)釋放掉這些內(nèi)存呢???回答是可以的!
/proc是一個(gè)虛擬文件系統(tǒng),我們可以通過(guò)對(duì)它的讀寫操作做為與kernel實(shí)體間進(jìn)行通信的一種手段.也就是說(shuō)可以通過(guò)修改/proc中的文件,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整.那么我們可以通過(guò)調(diào)整/proc/sys/vm/drop_caches來(lái)釋放內(nèi)存.操作如下:
[root@ centos test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默認(rèn)為0
[root@ centos test]# sync
手動(dòng)執(zhí)行sync命令(描述:sync 命令運(yùn)行 sync 子例程衡瓶。如果必須停止系統(tǒng)徘公,則運(yùn)行 sync 命令以確保文件系統(tǒng)的完整性。sync 命令將所有未寫的系統(tǒng)緩沖區(qū)寫到磁盤中哮针,包含已修改的 i-node步淹、已延遲的塊 I/O 和讀寫映射文件)
[root@ centos test]# echo 3 > /proc/sys/vm/drop_caches
[root@ centos test]# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches值設(shè)為3
再來(lái)運(yùn)行free命令,發(fā)現(xiàn)現(xiàn)在的used為66MB,free為182MB,buffers為0MB,cached為11MB.那么有效的釋放了buffer和cache.
有關(guān)/proc/sys/vm/drop_caches的用法在下面進(jìn)行了說(shuō)明
/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 are not freeable, the user should run sync(8) first.
========================================================================
buffer 與cache 的區(qū)別
對(duì)于共享內(nèi)存(Shared memory),主要用于在UNIX 環(huán)境下不同進(jìn)程之間共享數(shù)據(jù)诚撵,是進(jìn)程間通信的一種方法缭裆,一般的應(yīng)用程序不會(huì)申請(qǐng)使用共享內(nèi)存
Cache:高速緩存,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲(chǔ)器寿烟。由于CPU的速度遠(yuǎn)高于主內(nèi)存澈驼,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時(shí)間周期,Cache中保存著CPU剛用過(guò)或循環(huán)使用的一部分?jǐn)?shù)據(jù)筛武,當(dāng)CPU再次使用該部分?jǐn)?shù)據(jù)時(shí)可從Cache中直接調(diào)用,這樣就減少了CPU的等待時(shí)間,提高了系統(tǒng)的效率缝其。Cache又分為一級(jí)Cache(L1 Cache)和二級(jí)Cache(L2 Cache),L1 Cache集成在CPU內(nèi)部徘六,L2 Cache早期一般是焊在主板上,現(xiàn)在也都集成在CPU內(nèi)部内边,常見(jiàn)的容量有256KB或512KB L2 Cache。
Buffer:緩沖區(qū)待锈,一個(gè)用于存儲(chǔ)速度不同步的設(shè)備或優(yōu)先級(jí)不同的設(shè)備之間傳輸數(shù)據(jù)的區(qū)域漠其。通過(guò)緩沖區(qū),可以使進(jìn)程之間的相互等待變少,從而使從速度慢的設(shè)備讀入數(shù)據(jù)時(shí)和屎,速度快的設(shè)備的操作進(jìn)程不發(fā)生間斷拴驮。
Free中的buffer和cache:(它們都是占用內(nèi)存):
buffer : 作為buffer cache的內(nèi)存,是塊設(shè)備的讀寫緩沖區(qū)
cache: 作為page cache的內(nèi)存, 文件系統(tǒng)的cache.
如果 cache 的值很大柴信,說(shuō)明cache住的文件數(shù)很多套啤。如果頻繁訪問(wèn)到的文件都能被cache住,那么磁盤的讀IO bi會(huì)非常小随常。
cache是高速緩存潜沦,用于CPU和內(nèi)存之間的緩沖;buffer是I/O緩存绪氛,用于內(nèi)存和硬盤的緩沖cache最初用于cpu cache, 主要原因是cpu 與memory, 由于cpu快,memory跟不上,且有些值使用次數(shù)多,所以放入cache中止潮,主要目的是,重復(fù)使用, 并且一級(jí)\二級(jí)物理cache速度快钞楼,buffer主要用于disk 與 memory喇闸,主要是保護(hù)硬盤或減少網(wǎng)絡(luò)傳輸?shù)拇螖?shù)(內(nèi)存數(shù)據(jù)表現(xiàn)dataSet).當(dāng)然也可以提高速度(不會(huì)立即寫入硬盤或直接從硬盤中讀出的數(shù)據(jù)馬上顯示),重復(fù)使用.
Free中的buffer和cache:(它們都是占用內(nèi)存): buffer : 作為buffer cache的內(nèi)存询件,是塊設(shè)備的讀寫緩沖區(qū) cache: 作為page cache的內(nèi)存, 文件系統(tǒng)的cache 如果 cache 的值很大燃乍,說(shuō)明cache住的文件數(shù)很多。如果頻繁訪問(wèn)到的文件都能被cache住宛琅,那么磁盤的讀IO bi會(huì)非常小刻蟹。
# sync# echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches cache釋放:To free pagecache:echo 1 > /proc/sys/vm/drop_cachesTo free dentries and inodes:echo 2 > /proc/sys/vm/drop_cachesTo free pagecache, dentries and inodes:echo 3 > /proc/sys/vm/drop_caches
說(shuō)明,釋放前最好sync一下嘿辟,防止丟數(shù)據(jù)舆瘪。
因?yàn)長(zhǎng)INUX的內(nèi)核機(jī)制,一般情況下不需要特意去釋放已經(jīng)使用的cache红伦。這些cache起來(lái)的內(nèi)容可以增加文件以及的讀寫速度英古。