Linux系統中的Page cache和Buffer cache


Linux系統中的Page cache和Buffer cache

Linux中有兩個很容易混淆的概念,pagecache和buffercache,首先簡單將一些Linux系統下內存的分布,使用free -m命令可以查看內存分布情況:

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3770        1148        1252          17        1369        2377
Swap:          3967           0        3967

內存分布示意圖:

一些名詞的解釋:

Mem:表示物理內存統計。
total:表示物理內存總量(total = used + free)。
used:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用。
free:未被分配的內存。
shared:共享內存。
buffers:系統分配但未被使用的buffers數量。
cached:系統分配但未被使用的cache數量。
-/+ buffers/cache:表示物理內存的緩存統計。
used2:也就是第一行中的used – buffers - cached也是實際使用的內存總量。 // used2為第二行
free2 = buffers1 + cached1 + free1 // free2為第二行,buffers1等為第一行
free2:未被使用的buffers與cache和未被分配的內存之和,這就是系統當前實際可用內存。
Swap:當內存上放不下新加入的數據時,會將原有的部分資源交換到磁盤上,這塊地方就叫swap,表示硬盤上交換分區的使用情況。

在Free命令中顯示的buffer和cache,它們都是占用內存:

buffer : 作為buffer cache的內存,是塊設備的讀寫緩沖區,更靠近存儲設備,或者直接就是disk的緩沖區,通常是解決的是速度快的設備到速度慢的設備速度不匹配的問題。

cache: 作為page cache的內存, 文件系統的cache,是memory的緩沖區,主要解決慢設備到快設備速度不匹配的問題。

如果cache 的值很大,說明cache住的文件數很多,也就意味着程序需要的數據大多都在內存上,而不用去磁盤訪問,那么磁盤的讀IO 必會非常小 。

Page cache與Buffer Cache作用

page cache :頁緩存,負責緩存邏輯數據。

buffer cache : 塊緩存,負責緩存物理數據。

文件存儲在磁盤上,存儲最小單位是扇區,大小為0.5kb,磁盤讀取數據到內存時不會一個一個扇區的讀,這樣效率太低,而是先將扇區組成小塊,這個小塊就是buffer cache,大小為1kb,然后將塊組織成頁(pagecache,4kb)。

讀取數據具體流程是:先去讀取buffer cache,如果cache空間不夠,會通過一定的策略將一些過時或多次未被訪問的buffer cache清空。程序在下一次訪問磁盤時首先查看是否在buffer cache找到所需塊,命中可減少訪問磁盤時間。不命中時需重新讀入buffer cache。

對buffer cache的寫分為兩種,一是直接寫,這是程序在寫buffer cache后也寫磁盤,要讀時從buffer cache上讀,二是后台寫,程序在寫完buffer cache后並不立即寫磁盤,因為有可能程序在很短時間內又需要寫文件,如果直接寫,就需多次寫磁盤了。這樣效率很低,而是過一段時間后由后台寫,減少了多次訪磁盤的時間。

Page cache在linux讀寫文件時,它用於緩存文件的邏輯內容,從而加快對磁盤上映像和數據的訪問。具體說是加速對文件內容的訪問,buffer cache緩存文件的具體內容——物理磁盤上的磁盤塊,這是加速對磁盤的訪問。

Buffer cache是由物理內存分配,Linux系統為提高內存使用率,會將空閑內存全分給buffer cache ,當其他程序需要更多內存時,系統會減少cache大小。

Page cache和Buffer cache的區別

磁盤的操作有邏輯級(文件系統)和物理級(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級數據的。

假設我們通過文件系統操作文件,那么文件將被緩存到Page Cache,如果需要刷新文件的時候,Page Cache將交給Buffer Cache去完成,因為Buffer Cache就是緩存磁盤塊的。

也就是說,直接去操作文件,那就是Page Cache區緩存,用dd等命令直接操作磁盤塊,就是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。

Buffer(Buffer Cache)以塊形式緩沖了塊設備的操作,定時或手動的同步到硬盤,它是為了緩沖寫操作然后一次性將很多改動寫入硬盤,避免頻繁寫硬盤,提高寫入效率。

Cache(Page Cache)以頁面形式緩存了文件系統的文件,給需要使用的程序讀取,它是為了給讀操作提供緩沖,避免頻繁讀硬盤,提高讀取效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM