例子
[root@VM_16_17_centos bin]# free
total used free shared buff/cache available
Mem: 1882892 785272 280428 40496 817192 852060
Swap: 0 0 0
先說明一些基本概念
第一列
Mem 內(nèi)存的使用信息
Swap 交換空間的使用信息
第一行
total 系統(tǒng)總的可用物理內(nèi)存大小
used 已被使用的物理內(nèi)存大小
free 還有多少物理內(nèi)存可用
shared 被共享使用的物理內(nèi)存大小
buff/cache 被 buffer 和 cache 使用的物理內(nèi)存大小
available 還可以被 應(yīng)用程序 使用的物理內(nèi)存大小
其中有兩個概念需要注意
free 與 available 的區(qū)別
free 是真正尚未被使用的物理內(nèi)存數(shù)量。
available 是應(yīng)用程序認(rèn)為可用內(nèi)存數(shù)量,available = free + buffer + cache (注:只是大概的計算方法)
Linux 為了提升讀寫性能,會消耗一部分內(nèi)存資源緩存磁盤數(shù)據(jù),對于內(nèi)核來說,buffer 和 cache 其實都屬于已經(jīng)被使用的內(nèi)存。但當(dāng)應(yīng)用程序申請內(nèi)存時,如果 free 內(nèi)存不夠,內(nèi)核就會回收 buffer 和 cache 的內(nèi)存來滿足應(yīng)用程序的請求。這就是稍后要說明的 buffer 和 cache。
buff 和 cache 的區(qū)別
以下內(nèi)容來自# buffer和cache怎么讓你們解釋的那么難理解?
從字面上和語義來看,buffer名為緩沖,cache名為緩存。我們知道各種硬件存在制作工藝上的差別,所以當(dāng)兩種硬件需要交互的時候,肯定會存在速度上的差異,而且只有交互雙方都完成才可以各自處理別的其他事務(wù)。假如現(xiàn)在有兩個需要交互的設(shè)備A和B,A設(shè)備用來交互的接口速率為1000M/s,B設(shè)備用來交互的接口速率為500M/s,那他們彼此訪問的時候都會出現(xiàn)以下兩種情況:(以A來說)
一.A從B取一個1000M的文件結(jié)果需要2s,本來需要1s就可以完成的工作,卻還需要額外等待1s,B設(shè)備把剩余的500M找出來,這等待B取出剩下500M的空閑時間內(nèi)(1s)其他的事務(wù)還干不了
二.A給B一個1000M的文件結(jié)果也需要2s,本來需要也就1s就可以完成的工作,卻由于B,1s內(nèi)只能拿500M,剩下的500M還得等下一個1sB來取,這等待下1s的時間還做不了其他事務(wù)。
那有什么方法既可以讓A在‘取’或‘給’B的時候既能完成目標(biāo)任務(wù)又不浪費那1s空閑等待時間去處理其他事務(wù)呢?我們知道產(chǎn)生這種結(jié)果主要是因為B跟不上A的節(jié)奏,但即使這樣A也得必須等B處理完本次事務(wù)才能干其他活(單核cpu來說),除非你有三頭六臂。那有小伙伴可能會問了,能不能在A和B之間加一層區(qū)域比如說ab,讓ab既能跟上A的頻率也會照顧B的感受,沒錯我們確實可以這樣設(shè)計來磨合接口速率上的差異,你可以這樣想象,在區(qū)域ab提供了兩個交互接口一個是a接口另一個是b接口,a接口的速率接近A,b接口的速率最少等于B,然后我們把a(bǔ)b的a和A相連,ab的b和B相連,ab就像一座橋把A和B鏈接起來,并告知A和B通過他都能轉(zhuǎn)發(fā)給對方,文件可以暫時存儲,最終拓?fù)浯蟾湃缦拢?/p>

現(xiàn)在我們再來看上述兩種情況:
對于第一種情況A要B:當(dāng)A從B取一個1000M的文件,他把需求告訴了ab,接下來ab通過b和B進(jìn)行文件傳送,由于B本身的速率,傳送第一次ab并沒有什么卵用,對A來說不僅浪費了時間還浪費了感情,ab這家伙很快感受到了A的不滿,所以在第二次傳送的時候,ab背著B偷偷緩存了一個一模一樣的文件,而且只要從B取東西,ab都會緩存一個拷貝下來放在自己的大本營,如果下次A或者其他C來取B的東西,ab直接就給A或C一個貨真價實的贗品,然后把它通過a接口給了A或C,由于a的速率相對接近A的接口速率,所以A覺得不錯為他省了時間,最終和ab的a成了好基友,說白了此時的ab提供的就是一種緩存能力,即cache,絕對的走私!因為C取的是A執(zhí)行的結(jié)果。所以在這種工作模式下,怎么取得的東西是最新的也是我們需要考慮的,一般就是清cache。例如cpu讀取內(nèi)存數(shù)據(jù),硬盤一般都提供一個內(nèi)存作為緩存來增加系統(tǒng)的讀取性能
對于第二種情況A給B:當(dāng)A發(fā)給B一個1000M的文件,因為A知道通過ab的a接口就可以轉(zhuǎn)交給B,而且通過a接口要比通過B接口傳送文件需要等待的時間更短,所以1000M通過a接口給了ab ,站在A視圖上他認(rèn)為已經(jīng)把1000M的文件給了B,但對于ab并不立即交給B,而是先緩存下來,除非B執(zhí)行sync命令,即使B馬上要,但由于b的接口速率最少大于B接口速率,所以也不會存在漏洞時間,但最終的結(jié)果是A節(jié)約了時間就可以干其他的事務(wù),說白了就是推卸責(zé)任,哈哈而ab此時提供的就是一種緩沖的能力,即buffer,它存在的目的適用于當(dāng)速度快的往速度慢的輸出東西。例如內(nèi)存的數(shù)據(jù)要寫到磁盤,cpu寄存器里的數(shù)據(jù)寫到內(nèi)存。
看了上面這個例子,那我們現(xiàn)在看一下在計算機(jī)領(lǐng)域,在處理磁盤IO讀寫的時候,cpu,memory,disk基于這種模型給出的一個實例。我們先來一幅圖:(我從別家當(dāng)來的,我覺得,看N篇文檔 不如瞄此一圖)

page cache:文件系統(tǒng)層級的緩存,從磁盤里讀取的內(nèi)容是存儲到這里,這樣程序讀取磁盤內(nèi)容就會非???,比如使用grep和find等命令查找內(nèi)容和文件時,第一次會慢很多,再次執(zhí)行就快好多倍,幾乎是瞬間。但如上所說,如果對文件的更新不關(guān)心,就沒必要清cache,否則如果要實施同步,必須要把內(nèi)存空間中的cache clean下
buffer cache:磁盤等塊設(shè)備的緩沖,內(nèi)存的這一部分是要寫入到磁盤里的。這種情況需要注意,位于內(nèi)存buffer中的數(shù)據(jù)不是即時寫入磁盤,而是系統(tǒng)空閑或者buffer達(dá)到一定大小統(tǒng)一寫到磁盤中,所以斷電易失,為了防止數(shù)據(jù)丟失所以我們最好正常關(guān)機(jī)或者多執(zhí)行幾次sync命令,讓位于buffer上的數(shù)據(jù)立刻寫到磁盤里。