新聞中心
今天就跟大家聊聊有關(guān)Linux中的buffer cache free該如何理解,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
10年積累的成都做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有金秀免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
linux 中輸入free 可查看服務(wù)器內(nèi)存使用情況
1)、 -b, –bytes, 以Byte為單位顯示內(nèi)存使用情況
2)、 -k, –kilo, 以KB為單位, 這也是默認(rèn)值
3)、 -m, –mega, 以MB為單位顯示內(nèi)容使用情況
4)、 -g, –giga, 以GB為單位顯示內(nèi)存使用情況
5)、 -h, –human, 自動(dòng)將數(shù)值轉(zhuǎn)換為人類易讀形式
2)、 -c, –count, 展示結(jié)果count次,需與-s配合使用
3)、 -s, –seconds, 動(dòng)態(tài)刷新內(nèi)存使用情況的間隔
total 內(nèi)存總數(shù): 251G
used 已經(jīng)使用的內(nèi)存數(shù): 185G
free 空閑的內(nèi)存數(shù): 12G
shared 多個(gè)進(jìn)程共享的內(nèi)存總額 4.1G
buffers Buffer 緩存內(nèi)存數(shù): 內(nèi)存寫入到硬盤中間數(shù)據(jù),為解決空間
cached Page 緩存內(nèi)存數(shù):CPU提取數(shù)據(jù),在內(nèi)存跟CPU之間
available:目前可用的內(nèi)存數(shù)
total = use + free + buff/cache
available = free + buff/cache - shared
2.3、第三部分是指交換分區(qū)
? Swap空間的作用可簡單描述為:當(dāng)系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,就需要將物理內(nèi)存中的一部分空間釋放出來,以供當(dāng)前運(yùn)行的程序使用。那些被釋放的空間可能來自一些很長時(shí)間沒有什么操作的程序,這些被釋放的空間被臨時(shí)保存到Swap空間中,等到那些程序要運(yùn)行時(shí),再從Swap中恢復(fù)保存的數(shù)據(jù)到內(nèi)存中。這樣,系統(tǒng)總是在物理內(nèi)存不夠時(shí),才進(jìn)行Swap交換。其實(shí),Swap的調(diào)整對Linux服務(wù)器,特別是Web服務(wù)器的性能至關(guān)重要。通過調(diào)整Swap,有時(shí)可以越過系統(tǒng)性能瓶頸,節(jié)省系統(tǒng)升級費(fèi)用。
free命令顯示了當(dāng)前系統(tǒng)內(nèi)存使用情況,其數(shù)據(jù)取自 /proc/meminfo 文件。這里我們cat 一下。可見,在這個(gè)文件中,數(shù)據(jù)的存儲(chǔ)就是以KB為單位,所以free的默認(rèn)值也是KB
Linux中Buffer和Cache的區(qū)別
1. Cache:緩存區(qū),是高速緩存,是位于CPU和主內(nèi)存之間的容量較小但速度很快的存儲(chǔ)器,因?yàn)镃PU的速度遠(yuǎn)遠(yuǎn)高于主內(nèi)存的速度,CPU從內(nèi)存中讀取數(shù)據(jù)需等待很長的時(shí)間,而 Cache保存著CPU剛用過的數(shù)據(jù)或循環(huán)使用的部分?jǐn)?shù)據(jù),這時(shí)從Cache中讀取數(shù)據(jù)會(huì)更快,減少了CPU等待的時(shí)間,提高了系統(tǒng)的性能。
Cache并不是緩存文件的,而是緩存塊的(塊是I/O讀寫最小的單元);Cache一般會(huì)用在I/O請求上,如果多個(gè)進(jìn)程要訪問某個(gè)文件,可以把此文件讀入Cache中,這樣下一個(gè)進(jìn)程獲取CPU控制權(quán)并訪問此文件直接從Cache讀取,提高系統(tǒng)性能。
2. Buffer:緩沖區(qū),用于存儲(chǔ)速度不同步的設(shè)備或優(yōu)先級不同的設(shè)備之間傳輸數(shù)據(jù);通過buffer可以減少進(jìn)程間通信需要等待的時(shí)間,當(dāng)存儲(chǔ)速度快的設(shè)備與存儲(chǔ)速度慢的設(shè)備進(jìn)行通信時(shí),存儲(chǔ)慢的數(shù)據(jù)先把數(shù)據(jù)存放到buffer,達(dá)到一定程度存儲(chǔ)快的設(shè)備再讀取buffer的數(shù)據(jù),在此期間存儲(chǔ)快的設(shè)備CPU可以干其他的事情。
Buffer:一般是用在寫入磁盤的,例如:某個(gè)進(jìn)程要求多個(gè)字段被讀入,當(dāng)所有要求的字段被讀入之前已經(jīng)讀入的字段會(huì)先放到buffer中。
Cache講解
假設(shè)某地發(fā)生了自然災(zāi)害(比如地震),居民缺衣少食,于是派救火車去給若干個(gè)居民點(diǎn)送水。
救火車到達(dá)第一個(gè)居民點(diǎn),開閘放水,老百姓就拿著盆盆罐罐來接水。
假如說救火車在一個(gè)居民點(diǎn)停留100分鐘放完了水,然后重新儲(chǔ)水花半個(gè)小時(shí),再開往下一個(gè)居民點(diǎn)。這樣一個(gè)白天來來來回回的,也就是4-5個(gè)居民點(diǎn)。
但我們想想,救火車是何等存在,如果把水龍頭完全打開,其強(qiáng)大的水壓能輕易沖上10層樓以上, 10分鐘就可以把水全部放完。但因?yàn)榫用袷悄门韫藿铀?00%打開水龍頭那就是給人洗澡了,所以只能打開一小部分(比如10%的流量)。但這樣就降低了放水的效率(只有原來的10%了),10分鐘變100分鐘。
那么,我們是否能改進(jìn)這個(gè)放水的過程,讓救火車以最高效率放完水、盡快趕往下一個(gè)居民點(diǎn)呢?
方法就是:在居民點(diǎn)建蓄水池。
救火車把水放到蓄水池里,因?yàn)槭且?00%的效率放水,10分鐘結(jié)束然后走人。居民再從蓄水池里一點(diǎn)一點(diǎn)的接水。
我們分析一下這個(gè)例子,就可以知道Cache的含義了。
救火車要給居民送水,居民要從救火車接水,就是說居民和救火車之間有交互,有聯(lián)系。
但救火車是“高速設(shè)備”,居民是“低速設(shè)備”,低速的居民跟不上高速的救火車,所以救火車被迫降低了放水速度以適應(yīng)居民。
為了避免這種情況,在救火車和居民之間多了一層 “蓄水池(也就是Cache)”,它一方面以100%的高效和救火車打交道,另一方面以10%的低效和居民打交道,這就解放了救火車,讓其以最高的效率運(yùn)行,而不被低速的居民拖后腿,于是救火車只需要在一個(gè)居民點(diǎn)停留10分鐘就可以了。
所以說,蓄水池是“活雷鋒”,把高效留給別人,把低效留給自己。把10分鐘留給救火車,把100分鐘留給自己。
從以上例子可以看出,所謂Cache,就是“為了彌補(bǔ)高速設(shè)備和低速設(shè)備之間的矛盾”而設(shè)立的一個(gè)中間層。因?yàn)樵诂F(xiàn)實(shí)里經(jīng)常出現(xiàn)高速設(shè)備要和低速設(shè)備打交道,結(jié)果被低速設(shè)備拖后腿的情況。
以PC為例。CPU速度很快,但CPU執(zhí)行的指令是從內(nèi)存取出的,計(jì)算的結(jié)果也要寫回內(nèi)存,但內(nèi)存的響應(yīng)速度跟不上CPU。
CPU跟內(nèi)存說:你把某某地址的指令發(fā)給我。內(nèi)存聽到了,但因?yàn)樗俣嚷t遲不見指令返回,這段時(shí)間,CPU只能無所事事的等待了。這樣一來,再快的CPU也發(fā)揮不了效率。
怎么辦呢?在CPU和內(nèi)存之間加一塊“蓄水池”,也就是Cache(片上緩存),這個(gè)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)然不會(huì)是100%命中,因?yàn)镃ache的容量比內(nèi)存小)。
CPU的Cache,可以有好幾層,而且還分?jǐn)?shù)據(jù)Cache和指令Cache
磁盤緩存也是一樣,剛才說內(nèi)存是慢速設(shè)備,所以需要片上緩存,但這個(gè)“慢”是相對于CPU而言的,相對于機(jī)械硬盤HDD,內(nèi)存的速度可快多了。
對于磁盤的讀寫操作,在很久以前,讀寫過程需要CPU參與,后來出現(xiàn)了“DMA/直接內(nèi)存訪問"就不再需要CPU了,但即使如此,高負(fù)荷、長時(shí)間的磁盤讀寫也非常的耗時(shí),因?yàn)榇疟P是機(jī)械旋轉(zhuǎn)部件,其讀寫速度相比CPU和內(nèi)存條的二進(jìn)制電壓變化速度,那就是蒸汽機(jī)和火箭速度的差別。
為了加快數(shù)據(jù)的讀寫速度,在磁盤和內(nèi)存之間也插入一層Cache(Windows在內(nèi)存里劃分出一塊區(qū)域作為Cache,硬盤也有板載Cache。)寫入數(shù)據(jù)的時(shí)候先寫入到Cache里;因?yàn)镃ache很快,所以數(shù)據(jù)很快就寫入。比方說,1G的數(shù)據(jù),如果直接寫入硬盤需要10秒,但寫入Cache(也就是系統(tǒng)內(nèi)存)只需要1秒。這樣一來用戶就有了系統(tǒng)速度很快的“幻覺”。但這只是障眼法,數(shù)據(jù)暫存在Cache里并沒有被真正寫入磁盤,等系統(tǒng)空閑的時(shí)候再慢慢寫入。同理,在讀數(shù)據(jù)的時(shí)候,除了所需的數(shù)據(jù),還有一堆目前不需要的數(shù)據(jù)也都被讀出來放到內(nèi)存的Cache里。下次再讀的時(shí)候,如果恰巧Cache里有所需的數(shù)據(jù)就可直接讀入(命中),這就避免了從慢速的HDD讀數(shù)據(jù)的尷尬。用戶的體驗(yàn)同樣也是速度很快。(同樣不會(huì)100%命中,因?yàn)镽AM的容量遠(yuǎn)小于硬盤容量)。
buffer講解
比如說吐魯番的葡萄熟了,要用大卡車裝葡萄運(yùn)出去賣
果園的姑娘采摘葡萄,當(dāng)然不是前手把葡萄摘下來,后手就放到卡車上,而是需要一個(gè)中間過程“籮筐”:摘葡萄→放到籮筐里→把籮筐里的葡萄倒入卡車。
也就是說,雖然最終目的是“把葡萄倒入卡車”,但中間必須要經(jīng)過“籮筐”的轉(zhuǎn)手,這里的籮筐就是Buffer。是“暫時(shí)存放物品的空間”。
注意2個(gè)關(guān)鍵詞:暫時(shí),空間
再換句話說,為了完成最終目標(biāo):把葡萄放入卡車的空間,需要暫時(shí)把葡萄放入籮筐的空間。
以BT為例,BT下載需要長時(shí)間的掛機(jī),電腦就有可能24小時(shí)連軸轉(zhuǎn),但BT下載的數(shù)據(jù)是碎片化的,體現(xiàn)在硬盤寫入上也是碎片化的,因?yàn)橛脖P是機(jī)械尋址器件,這種碎片化的寫入會(huì)造成硬盤長時(shí)間高負(fù)荷的機(jī)械運(yùn)動(dòng),造成硬盤過早老化損壞,當(dāng)年有大量的硬盤因?yàn)锽T下載而損壞。
于是新出的BT軟件在內(nèi)存里開辟了Buffer,數(shù)據(jù)暫時(shí)寫入Buffer,攢到一定的大小(比如512M)再一次性寫入硬盤,這種“化零為整”的寫入方式大大降低了硬盤的負(fù)荷。
這就是:為了完成最終目標(biāo):把數(shù)據(jù)寫入硬盤空間,需要暫時(shí)寫入Buffer的空間。
再以編程為例,假設(shè)要實(shí)現(xiàn)一個(gè)功能:接受用戶鍵入的字符串,并賦值給一個(gè)字符串變量
其過程如下:
1:在內(nèi)存中開辟一個(gè)”鍵盤緩沖區(qū)“接受用戶鍵入的字符串
2:把緩沖區(qū)中的字符串copy到程序中定義的字符串變量指向的內(nèi)存空間(也就是賦值過程)
也就是說,為了完成最終目標(biāo):把字符串放入字符串變量指向的空間,需要暫時(shí)把字符串放入“鍵盤緩沖區(qū)”的空間。
以上舉的3個(gè)栗子:籮筐、BT的Buffer,鍵盤緩沖區(qū)的Buffer
Buffer的存在是為了解決什么問題?找個(gè)臨時(shí)的存儲(chǔ)空間!
總結(jié):
Cache和Buffer的相同點(diǎn):都是2個(gè)層面之間的中間層,都是內(nèi)存。
Cache和Buffer的不同點(diǎn):Cache解決的是時(shí)間問題,Buffer解決的是空間問題。
為了提高速度,引入了Cache這個(gè)中間層。
為了給信息找到一個(gè)暫存空間,引入了Buffer這個(gè)中間層。
為了解決2個(gè)不同維度的問題(時(shí)間、空間),恰巧取了同一種解決方法:加入一個(gè)中間層,先把數(shù)據(jù)寫到中間層上,然后再寫入目標(biāo)。
這個(gè)中間層就是內(nèi)存“RAM”,既然是存儲(chǔ)器就有2個(gè)參數(shù):寫入的速度有多塊(速度),能裝多少東西(容量)
Cache利用的是RAM提供的高讀寫速度,Buffer利用的是RAM提供的存儲(chǔ)容量(空間)。
1、Buffer(緩沖區(qū))是系統(tǒng)兩端處理速度平衡(從長時(shí)間尺度上看)時(shí)使用的。它的引入是為了減小短期內(nèi)突發(fā)I/O的影響,起到流量整形的作用。比如生產(chǎn)者——消費(fèi)者問題,他們產(chǎn)生和消耗資源的速度大體接近,加一個(gè)buffer可以抵消掉資源剛產(chǎn)生/消耗時(shí)的突然變化。
2、Cache(緩存)則是系統(tǒng)兩端處理速度不匹配時(shí)的一種折衷策略。因?yàn)镃PU和memory之間的速度差異越來越大,所以人們充分利用數(shù)據(jù)的局部性(locality)特征,通過使用存儲(chǔ)系統(tǒng)分級(memory hierarchy)的策略來減小這種差異帶來的影響。
3、假定以后存儲(chǔ)器訪問變得跟CPU做計(jì)算一樣快,cache就可以消失,但是buffer依然存在。比如從網(wǎng)絡(luò)上下載東西,瞬時(shí)速率可能會(huì)有較大變化,但從長期來看卻是穩(wěn)定的,這樣就能通過引入一個(gè)buffer使得OS接收數(shù)據(jù)的速率更穩(wěn)定,進(jìn)一步減少對磁盤的傷害。
1、buffer(緩沖)是為了提高內(nèi)存和硬盤(或其他I/O設(shè)備)之間的數(shù)據(jù)交換的速度而設(shè)計(jì)的。
緩沖(buffers)是根據(jù)磁盤的讀寫設(shè)計(jì)的,把分散的寫操作集中進(jìn)行,減少磁盤碎片和硬盤的反復(fù)尋道,從而提高系統(tǒng)性能。linux有一個(gè)守護(hù)進(jìn)程定期清空緩沖內(nèi)容(即寫入磁盤),也可以通過sync命令手動(dòng)清空緩沖。
簡單來說,buffer是即將要被寫入磁盤的,而cache是被從磁盤中讀出來的。 buffer是由各種進(jìn)程分配的,被用在如輸入隊(duì)列等方面。一個(gè)簡單的例子如某個(gè)進(jìn)程要求有多個(gè)字段讀入,在所有字段被讀入完整之前,進(jìn)程把先前讀入的字段放在buffer中保存。cache經(jīng)常被用在磁盤的I/O請求上,如果有多個(gè)進(jìn)程都要訪問某個(gè)文件,于是該文件便被做成cache以方便下次被訪問,這樣可提高系統(tǒng)性能。
2、cache(緩存)
從CPU角度考慮,是為了提高cpu和內(nèi)存之間的數(shù)據(jù)交換速度而設(shè)計(jì)的,例如平常見到的一級緩存、二級緩存、三級緩存。 cpu在執(zhí)行程序所用的指令和讀數(shù)據(jù)都是針對內(nèi)存的,也就是從內(nèi)存中取得的。由于內(nèi)存讀寫速度慢,為了提高cpu和內(nèi)存之間數(shù)據(jù)交換的速度,在cpu和內(nèi)存之間增加了cache,它的速度比內(nèi)存快,但是造價(jià)高,又由于在cpu內(nèi)不能集成太多集成電路,所以一般cache比較小,以后intel等公司為了進(jìn)一步提高速度,又增加了二級cache,甚至三級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ù)。
看完上述內(nèi)容,你們對Linux中的buffer cache free該如何理解有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
文章題目:Linux中的buffercachefree該如何理解
轉(zhuǎn)載來于:http://www.ef60e0e.cn/article/jegedd.html