清理buffer/cache/swap的方法梳理
一、緩存機(jī)制介紹
在Linux系統(tǒng)中,為了提高文件系統(tǒng)性能,內(nèi)核利用一部分物理內(nèi)存分配出緩沖區(qū),用于緩存系統(tǒng)操作和數(shù)據(jù)文件,當(dāng)內(nèi)核收到讀寫的請求時(shí),內(nèi)核先去緩存區(qū)找是否有請求的數(shù)據(jù),有就直接返回,如果沒有則通過驅(qū)動程序直接操作磁盤。
緩存機(jī)制優(yōu)點(diǎn):減少系統(tǒng)調(diào)用次數(shù),降低CPU上下文切換和磁盤訪問頻率。
CPU上下文切換:CPU給每個進(jìn)程一定的服務(wù)時(shí)間,當(dāng)時(shí)間片用完后,內(nèi)核從正在運(yùn)行的進(jìn)程中收回處理器,同時(shí)把進(jìn)程當(dāng)前運(yùn)行狀態(tài)保存下來,然后加載下一個任務(wù),這個過程叫做上下文切換。實(shí)質(zhì)上就是被終止運(yùn)行進(jìn)程與待運(yùn)行進(jìn)程的進(jìn)程切換。
Swap用途:Swap意思是交換分區(qū),通常我們說的虛擬內(nèi)存,是從硬盤中劃分出的一個分區(qū)。當(dāng)物理內(nèi)存不夠用的時(shí)候,內(nèi)核就會釋放緩存區(qū)(buffers/cache)里一些長時(shí)間不用的程序,然后將這些程序臨時(shí)放到Swap中,也就是說如果物理內(nèi)存和緩存區(qū)內(nèi)存不夠用的時(shí)候,才會用到Swap。
swap清理:swapoff -a && swapon -a
注意:這樣清理有個前提條件,空閑的內(nèi)存必須比已經(jīng)使用的swap空間大
二、查看緩存區(qū)及內(nèi)存使用情況
free命令用于檢測物理內(nèi)存和交換內(nèi)存已使用量和可用量(默認(rèn)單位為KB) [root@backup ~]# free -m //使用-m參數(shù)表示以兆字節(jié)為單位顯示內(nèi)存total used free shared buffers cached Mem: 64181 44372 19809 3 12 216 -/+ buffers/cache: 44143 20038 Swap: 32767 0 32767第一部分Mem行解釋: total:內(nèi)存總數(shù); used:已經(jīng)使用的內(nèi)存數(shù); free:空閑的內(nèi)存數(shù); shared:當(dāng)前已經(jīng)廢棄不用; buffers Buffer:緩存內(nèi)存數(shù); cached Page:緩存內(nèi)存數(shù)。 關(guān)系:total = used + free第二部分(-/+ buffers/cache)解釋: (-buffers/cache) used內(nèi)存數(shù):第一部分Mem行中的 used – buffers – cached (+buffers/cache) free內(nèi)存數(shù): 第一部分Mem行中的 free + buffers + cached可見-buffers/cache反映的是被程序?qū)崒?shí)在在吃掉的內(nèi)存,而+buffers/cache反映的是可以挪用的內(nèi)存總數(shù)。第三部分是指交換分區(qū)。--------------------------------------------------------------------------------------------- 以字節(jié)為單位顯示內(nèi)存 加上-b參數(shù)的free命令,以字節(jié)為單位顯示內(nèi)存的大小。[root@backup ~]# free -btotal used free shared buffers cached Mem: 67299549184 46525181952 20774367232 3272704 12820480 227033088 -/+ buffers/cache: 46285328384 21014220800 Swap: 34359734272 0 34359734272 ------------------------------------------------------------------------------------------- 以千字節(jié)為單位顯示內(nèi)存 加上-k參數(shù)的free命令(默認(rèn)單位,所以可以不用使用它),以(KB)千字節(jié)為單位顯示內(nèi)存大小。 [root@backup ~]# free -ktotal used free shared buffers cached Mem: 65722216 45435760 20286456 3196 12520 221712 -/+ buffers/cache: 45201528 20520688 Swap: 33554428 0 33554428 ------------------------------------------------------------------------------------------- 以千兆字節(jié)為單位顯示內(nèi)存 使用-g為參數(shù),將會以GB(千兆字節(jié))為單位顯示內(nèi)存大小。 [root@backup ~]# free -gtotal used free shared buffers cached Mem: 62 43 19 0 0 0 -/+ buffers/cache: 43 19 Swap: 31 0 31 ------------------------------------------------------------------------------------------ 定期時(shí)間間隔更新內(nèi)存狀態(tài) -s選項(xiàng)加上一個整數(shù),用來在定期時(shí)間間隔內(nèi)更新free命令。舉個例子,下面的命令將會在每5秒更新一個free命令。 [root@backup ~]# free -s 5total used free shared buffers cached Mem: 65722216 45436660 20285556 3196 12712 222096 -/+ buffers/cache: 45201852 20520364 Swap: 33554428 0 33554428total used free shared buffers cached Mem: 65722216 45436592 20285624 3196 12720 222096 -/+ buffers/cache: 45201776 20520440 Swap: 33554428 0 33554428三、buffers和cached解釋
=========================================================
緩存(cached)是把讀取過的數(shù)據(jù)保存起來,重新讀取時(shí)若命中(找到需要的數(shù)據(jù))就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數(shù)據(jù)會根據(jù)讀取頻率進(jìn)行組織,把最頻繁讀取的內(nèi)容放在最容易找到的位置,把不再讀的內(nèi)容不斷往后排,直至從中刪除。
緩沖(buffers)是根據(jù)磁盤的讀寫設(shè)計(jì)的,把分散的寫操作集中進(jìn)行,減少磁盤碎片和硬盤的反復(fù)尋道,從而提高系統(tǒng)性能。linux有一個守護(hù)進(jìn)程定期清空緩沖內(nèi)容(即寫入磁盤),也可以通過sync命令手動清空緩沖。舉個例子吧:我這里有一個ext2的U盤,我往里面cp一個3M的MP3,但U盤的燈沒有跳動,過了一會兒(或者手動輸入sync)U盤的燈就跳動起來了。卸載設(shè)備時(shí)會清空緩沖,所以有些時(shí)候卸載一個設(shè)備時(shí)要等上幾秒鐘。
修改/etc/sysctl.conf中的vm.swappiness右邊的數(shù)字可以在下次開機(jī)時(shí)調(diào)節(jié)swap使用策略。該數(shù)字范圍是0~100,數(shù)字越大越傾向于使用swap。默認(rèn)為60,可以改一下試試。–兩者都是RAM中的數(shù)據(jù)。
兩者都是RAM中的數(shù)據(jù),簡單來說,buffer是即將要被寫入磁盤的,而cache是被從磁盤中讀出來的。
buffer是由各種進(jìn)程分配的,被用在如輸入隊(duì)列等方面。一個簡單的例子如某個進(jìn)程要求有多個字段讀入,在所有字段被讀入完整之前,進(jìn)程把先前讀入的字段放在buffer中保存。
cache經(jīng)常被用在磁盤的I/O請求上,如果有多個進(jìn)程都要訪問某個文件,于是該文件便被做成cache以方便下次被訪問,這樣可提高系統(tǒng)性能。
Cache:緩沖區(qū),高速緩存,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠(yuǎn)高于主內(nèi)存,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時(shí)間周期,Cache中保存著CPU剛用過或循環(huán)使用的一部分?jǐn)?shù)據(jù),當(dāng)CPU再次使用該部分?jǐn)?shù)據(jù)時(shí)可從Cache中直接調(diào)用,這樣就減少了CPU的等待時(shí)間,提高了系統(tǒng)的效率。Cache又分為一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache集成在CPU內(nèi)部,L2 Cache早期一般是焊在主板上,現(xiàn)在也都集成在CPU內(nèi)部,常見的容量有256KB或512KB L2 Cache。它是根據(jù)程序的局部性原理而設(shè)計(jì)的,就是cpu執(zhí)行的指令和訪問的數(shù)據(jù)往往在集中的某一塊,所以把這塊內(nèi)容放入cache后,cpu就不用在訪問內(nèi)存了,這就提高了訪問速度。當(dāng)然若cache中沒有cpu所需要的內(nèi)容,還是要訪問內(nèi)存的。從內(nèi)存讀取與磁盤讀取角度考慮,cache可以理解為操作系統(tǒng)為了更高的讀取效率,更多的使用內(nèi)存來緩存可能被再次訪問的數(shù)據(jù)。
Cache并不是緩存文件的,而是緩存塊的(塊是I/O讀寫最小的單元);Cache一般會用在I/O請求上,如果多個進(jìn)程要訪問某個文件,可以把此文件讀入Cache中,這樣下一個進(jìn)程獲取CPU控制權(quán)并訪問此文件直接從Cache讀取,提高系統(tǒng)性能。
Buffer:緩沖區(qū),一個用于存儲速度不同步的設(shè)備或優(yōu)先級不同的設(shè)備之間傳輸數(shù)據(jù)的區(qū)域。通過buffer可以減少進(jìn)程間通信需要等待的時(shí)間,當(dāng)存儲速度快的設(shè)備與存儲速度慢的設(shè)備進(jìn)行通信時(shí),存儲慢的數(shù)據(jù)先把數(shù)據(jù)存放到buffer,達(dá)到一定程度存儲快的設(shè)備再讀取buffer的數(shù)據(jù),在此期間存儲快的設(shè)備CPU可以干其他的事情。
Buffer:一般是用在寫入磁盤的,例如:某個進(jìn)程要求多個字段被讀入,當(dāng)所有要求的字段被讀入之前已經(jīng)讀入的字段會先放到buffer中。Buffer是根據(jù)磁盤的讀寫設(shè)計(jì)的,把分散的寫操作集中進(jìn)行,減少磁盤碎片和硬盤的反復(fù)尋道,從而提高系統(tǒng)性能。linux有一個守護(hù)進(jìn)程定期清空緩沖內(nèi)容(即寫入磁盤),也可以通過sync命令手動清空緩沖。
cache是高速緩存,用于CPU和內(nèi)存之間的緩沖;
buffer是I/O緩存,用于內(nèi)存和硬盤的緩沖;
cache最初用于cpu cache,主要原因是cpu 與memory,由于cpu快,memory跟不上,且有些值使用次數(shù)多,所以放入cache中,主要目的是,重復(fù)使用,并且一級\二級物理cache速度快,
buffer主要用于disk與 memory,主要是保護(hù)硬盤或減少網(wǎng)絡(luò)傳輸?shù)拇螖?shù)(內(nèi)存數(shù)據(jù)表現(xiàn)dataSet).當(dāng)然也可以提高速度(不會立即寫入硬盤或直接從硬盤中讀出的數(shù)據(jù)馬上顯示),重復(fù)使用,最初最主要的目的是保護(hù)disk,
Free中的buffer和cache:(它們都是占用內(nèi)存):
buffer : 作為buffer cache的內(nèi)存,是塊設(shè)備的讀寫緩沖區(qū)
cache: 作為page cache的內(nèi)存, 文件系統(tǒng)的cache
如果 cache 的值很大,說明cache住的文件數(shù)很多。如果頻繁訪問到的文件都能被cache住,那么磁盤的讀IO bi會非常小。
下面通過一些簡單通俗的例子來說明下Cache和Buffer緩存之間的區(qū)別:
1)Cache緩存
假設(shè)某地發(fā)生了自然災(zāi)害(比如地震),居民缺衣少食,于是派救火車去給若干個居民點(diǎn)送水。救火車到達(dá)第一個居民點(diǎn),開閘放水,老百姓就拿著盆盆罐罐來接水。假如說救火車在一個居民點(diǎn)停留100分鐘放完了水,然后重新儲水花半個小時(shí),再開往下一個居民點(diǎn)。這樣一個白天來來來回回的,也就是4-5個居民點(diǎn)。
但我們想想,救火車是何等存在,如果把水龍頭完全打開,其強(qiáng)大的水壓能輕易沖上10層樓以上, 10分鐘就可以把水全部放完。但因?yàn)榫用袷悄门韫藿铀?#xff0c;100%打開水龍頭那就是給人洗澡了,所以只能打開一小部分(比如10%的流量)。但這樣就降低了放水的效率(只有原來的10%了),10分鐘變100分鐘。
那么,我們是否能改進(jìn)這個放水的過程,讓救火車以最高效率放完水、盡快趕往下一個居民點(diǎn)呢?
方法就是:在居民點(diǎn)建蓄水池。
救火車把水放到蓄水池里,因?yàn)槭且?00%的效率放水,10分鐘結(jié)束然后走人。居民再從蓄水池里一點(diǎn)一點(diǎn)的接水。
我們分析一下這個例子,就可以知道Cache的含義了。
救火車要給居民送水,居民要從救火車接水,就是說居民和救火車之間有交互,有聯(lián)系。
但救火車是"高速設(shè)備",居民是"低速設(shè)備",低速的居民跟不上高速的救火車,所以救火車被迫降低了放水速度以適應(yīng)居民。
為了避免這種情況,在救火車和居民之間多了一層"蓄水池(也就是Cache)",它一方面以100%的高效和救火車打交道,另一方面以10%的低效和居民打交道,這就解放了救火車,讓其以最高的效率運(yùn)行,而不被低速的居民拖后腿,于是救火車只需要在一個居民點(diǎn)停留10分鐘就可以了。
所以說,蓄水池是"活雷鋒",把高效留給別人,把低效留給自己。把10分鐘留給救火車,把100分鐘留給自己。
從以上例子可以看出,所謂Cache,就是"為了彌補(bǔ)高速設(shè)備和低速設(shè)備之間的矛盾"而設(shè)立的一個中間層。因?yàn)樵诂F(xiàn)實(shí)里經(jīng)常出現(xiàn)高速設(shè)備要和低速設(shè)備打交道,結(jié)果被低速設(shè)備拖后腿的情況。Cache的存在是為了解決什么問題?速度太慢了,要加快速度!
以PC為例。CPU速度很快,但CPU執(zhí)行的指令是從內(nèi)存取出的,計(jì)算的結(jié)果也要寫回內(nèi)存,但內(nèi)存的響應(yīng)速度跟不上CPU。CPU跟內(nèi)存說:你把某某地址的指令發(fā)給我。內(nèi)存聽到了,但因?yàn)樗俣嚷?#xff0c;遲遲不見指令返回,這段時(shí)間,CPU只能無所事事的等待了。這樣一來,再快的CPU也發(fā)揮不了效率。
怎么辦呢?在CPU和內(nèi)存之間加一塊"蓄水池",也就是Cache(片上緩存),這個Cache速度比內(nèi)存快,從Cache取指令不需要等待。當(dāng)CPU要讀內(nèi)存的指令的時(shí)候先讀Cache再讀內(nèi)存,但一開始Cache是空著的,只能從內(nèi)存取,這時(shí)候的確是很慢,CPU需要等待。但從內(nèi)存取回的不僅僅是CPU所需要的指令,還有其它的、當(dāng)前不需要的指令,然后把這些指令存在Cache里備用。CPU再取指令的時(shí)候還是先讀Cache,看看里面有沒有所需指令,如果碰巧有就直接從Cache取,不用等待即可返回(命中),這就解放了CPU,提高了效率。(當(dāng)然不會是100%命中,因?yàn)镃ache的容量比內(nèi)存小)
2)Buffer緩存
比如說吐魯番的葡萄熟了,要用大卡車裝葡萄運(yùn)出去賣果園的姑娘采摘葡萄,當(dāng)然不是前手把葡萄摘下來,后手就放到卡車上,而是需要一個中間過程"籮筐":摘葡萄→放到籮筐里→把籮筐里的葡萄倒入卡車。也就是說,雖然最終目的是"把葡萄倒入卡車",但中間必須要經(jīng)過"籮筐"的轉(zhuǎn)手,這里的籮筐就是Buffer。是"暫時(shí)存放物品的空間"。
注意2個關(guān)鍵詞:暫時(shí),空間
再換句話說,為了完成最終目標(biāo):把葡萄放入卡車的空間,需要暫時(shí)把葡萄放入籮筐的空間。
以BT為例,BT下載需要長時(shí)間的掛機(jī),電腦就有可能24小時(shí)連軸轉(zhuǎn),但BT下載的數(shù)據(jù)是碎片化的,體現(xiàn)在硬盤寫入上也是碎片化的,因?yàn)橛脖P是機(jī)械尋址器件,這種碎片化的寫入會造成硬盤長時(shí)間高負(fù)荷的機(jī)械運(yùn)動,造成硬盤過早老化損壞,當(dāng)年有大量的硬盤因?yàn)锽T下載而損壞。于是新出的BT軟件在內(nèi)存里開辟了Buffer,數(shù)據(jù)暫時(shí)寫入Buffer,攢到一定的大小(比如512M)再一次性寫入硬盤,這種"化零為整"的寫入方式大大降低了硬盤的負(fù)荷。這就是:為了完成最終目標(biāo):把數(shù)據(jù)寫入硬盤空間,需要暫時(shí)寫入Buffer的空間。
3)二者之間的區(qū)別總結(jié)
Cache和Buffer的相同點(diǎn):都是2個層面之間的中間層,都是內(nèi)存。
Cache和Buffer的不同點(diǎn):Cache解決的是時(shí)間問題,Buffer解決的是空間問題。
為了提高速度,引入了Cache這個中間層。
為了給信息找到一個暫存空間,引入了Buffer這個中間層。
為了解決2個不同維度的問題(時(shí)間、空間),恰巧取了同一種解決方法:加入一個中間層,先把數(shù)據(jù)寫到中間層上,然后再寫入目標(biāo)。
這個中間層就是內(nèi)存“RAM”,既然是存儲器就有2個參數(shù):寫入的速度有多塊(速度),能裝多少東西(容量)
Cache利用的是RAM提供的高讀寫速度,Buffer利用的是RAM提供的存儲容量(空間)。
a)Buffer(緩沖區(qū))是系統(tǒng)兩端處理速度平衡(從長時(shí)間尺度上看)時(shí)使用的。它的引入是為了減小短期內(nèi)突發(fā)I/O的影響,起到流量整形的作用。比如生產(chǎn)者——消費(fèi)者問題,他們產(chǎn)生和消耗資源的速度大體接近,加一個buffer可以抵消掉資源剛產(chǎn)生/消耗時(shí)的突然變化。
b)Cache(緩存)則是系統(tǒng)兩端處理速度不匹配時(shí)的一種折衷策略。因?yàn)镃PU和memory之間的速度差異越來越大,所以人們充分利用數(shù)據(jù)的局部性(locality)特征,通過使用存儲系統(tǒng)分級(memory hierarchy)的策略來減小這種差異帶來的影響。
c假定以后存儲器訪問變得跟CPU做計(jì)算一樣快,cache就可以消失,但是buffer依然存在。比如從網(wǎng)絡(luò)上下載東西,瞬時(shí)速率可能會有較大變化,但從長期來看卻是穩(wěn)定的,這樣就能通過引入一個buffer使得OS接收數(shù)據(jù)的速率更穩(wěn)定,進(jìn)一步減少對磁盤的傷害。
四、手動清理緩
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學(xué)習(xí)Python基地,里面有很多學(xué)習(xí)資料,感興趣的+Q群:895817687 -------------------------------------------------------------------- 釋放緩存區(qū)內(nèi)存的方法 1)清理pagecache(頁面緩存) [root@backup ~]# echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=12)清理dentries(目錄緩存)和inodes [root@backup ~]# echo 2 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=23)清理pagecache、dentries和inodes [root@backup ~]# echo 3 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=3上面三種方式都是臨時(shí)釋放緩存的方法,要想永久釋放緩存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!另外,可以使用sync命令來清理文件系統(tǒng)緩存,還會清理僵尸(zombie)對象和它們占用的內(nèi)存 [root@backup ~]# sync溫馨提示: 上面操作在大多數(shù)情況下都不會對系統(tǒng)造成傷害,只會有助于釋放不用的內(nèi)存。 但是如果在執(zhí)行這些操作時(shí)正在寫數(shù)據(jù),那么實(shí)際上在數(shù)據(jù)到達(dá)磁盤之前就將它從文件緩存中清除掉了,這可能會造成很不好的影響。那么如果避免這種事情發(fā)生呢? 因此,這里不得不提一下/proc/sys/vm/vfs_cache_pressure這個文件,告訴內(nèi)核,當(dāng)清理inoe/dentry緩存時(shí)應(yīng)該用什么樣的優(yōu)先級。 [root@backup ~]# cat /proc/sys/vm/vfs_cache_pressure 100vfs_cache_pressure=100 這個是默認(rèn)值,內(nèi)核會嘗試重新聲明dentries和inodes,并采用一種相對于頁面緩存和交換緩存比較"合理"的比例。減少vfs_cache_pressure的值,會導(dǎo)致內(nèi)核傾向于保留dentry和inode緩存。 增加vfs_cache_pressure的值,(即超過100時(shí)),則會導(dǎo)致內(nèi)核傾向于重新聲明dentries和inodes總之,vfs_cache_pressure的值: 小于100的值不會導(dǎo)致緩存的大量減少 超過100的值則會告訴內(nèi)核你希望以高優(yōu)先級來清理緩存。其實(shí)無論vfs_cache_pressure的值采用什么值,內(nèi)核清理緩存的速度都是比較低的。 如果將此值設(shè)置為10000,系統(tǒng)將會將緩存減少到一個合理的水平。 ======================================================這里順便說下自己遇到的一個內(nèi)存問題: IDC機(jī)房有一臺專門的備份服務(wù)器,每天凌晨執(zhí)行多個備份腳本。某天早上突然發(fā)現(xiàn)收到很多條zabbix監(jiān)控報(bào)警信息:這臺備份服務(wù)器的內(nèi)存使用了已超過80%! 于是,趕緊登陸這臺備份服務(wù)器,使用free命令查看內(nèi)存使用情況: [root@backup ~]# free -mtotal used free shared buffers cached Mem: 64181 48585 15596 3 2 18 -/+ buffers/cache: 48564 15617 Swap: 32767 0 3276確實(shí)發(fā)現(xiàn)內(nèi)存使用率已超過80%!但是使用"top"命令查看,發(fā)現(xiàn)此時(shí)并沒有什么進(jìn)程在占用內(nèi)存,并且本機(jī)是備份服務(wù)器,只有晚上執(zhí)行備份腳本, 其他時(shí)間都沒有服務(wù)進(jìn)程在跑!于是嘗試手動釋放內(nèi)存: [root@backup ~]# echo 1 > /proc/sys/vm/drop_caches [root@backup ~]# echo 2 > /proc/sys/vm/drop_caches [root@backup ~]# echo 3 > /proc/sys/vm/drop_caches [root@backup ~]# sync發(fā)現(xiàn)在執(zhí)行了上面第三條命令后,內(nèi)存才真正被釋放出來了,其他命令都沒有起到效果。 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的清理buffer/cache/swap的方法梳理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Beanstalkd工作队列
- 下一篇: 1.uniq去重命令讲解