Linux系統中的Page cache和Buffer cache

Linux系統中的Page cache和Buffer cache


Free命令顯示內存

首先,我們來了解下內存的使用情況:

clip_image001

 

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:表示硬盤上交換分區的使用情況。

 

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

buffer : 作爲buffer cache的內存,是塊設備的讀寫緩衝區,更靠近存儲設備,或者直接就是disk的緩衝區。

cache: 作爲page cache的內存, 文件系統的cache,是memory的緩衝區 。

如果cache 的值很大,說明cache住的文件數很多。如果頻繁訪問到的文件都能被cache住,那麼磁盤的讀IO 必會非常小 。

 

Page cache(頁面緩存)

Page cache 也叫頁緩衝或文件緩衝,是由好幾個磁盤塊構成,大小通常爲4k,在64位系統上爲8k,構成的幾個磁盤塊在物理磁盤上不一定連續,文件的組織單位爲一頁, 也就是一個page cache大小,文件讀取是由外存上不連續的幾個磁盤塊,到buffer cache,然後組成page cache,然後供給應用程序。

 

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

 

Buffer cache(塊緩存)

Buffer cache 也叫塊緩衝,是對物理磁盤上的一個磁盤塊進行的緩衝,其大小爲通常爲1k,磁盤塊也是磁盤的組織單位。設立buffer cache的目的是爲在程序多次訪問同一磁盤塊時,減少訪問時間。系統將磁盤塊首先讀入buffer cache 如果cache空間不夠時,會通過一定的策略將一些過時或多次未被訪問的buffer cache清空。程序在下一次訪問磁盤時首先查看是否在buffer cache找到所需塊,命中可減少訪問磁盤時間。不命中時需重新讀入buffer cache。對buffer cache 的寫分爲兩種,一是直接寫,這是程序在寫buffer cache後也寫磁盤,要讀時從buffer cache 上讀,二是後臺寫,程序在寫完buffer cache 後並不立即寫磁盤,因爲有可能程序在很短時間內又需要寫文件,如果直接寫,就需多次寫磁盤了。這樣效率很低,而是過一段時間後由後臺寫,減少了多次訪磁盤 的時間。

 

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

 

Buffer page(緩衝頁)

如果內核需要單獨訪問一個塊,就會涉及到buffer page,並會檢查對應的buffer head。

 

Swap space(交換空間)

Swap space 交換空間,是虛擬內存的表現形式。系統爲了應付一些需要大量內存的應用,而將磁盤上的空間做內存使用,當物理內存不夠用時,將其中一些暫時不需的數據交換 到交換空間,也叫交換文件或頁面文件中。做虛擬內存的好處是讓進程以爲好像可以訪問整個系統物理內存。因爲在一個進程訪問數據時,其他進程的數據會被交換 到交換空間中。

 

Swap cache(交換緩存)

swapcached,它表示交換緩存的大小。Page cache是磁盤數據在內存中的緩存,而swap cache則是交換分區在內存中的臨時緩存。

 

Memory mapping(內存映射)

內 核有兩種類型的內存映射:共享型(shared)和私有型(private)。私有型是當進程爲了只讀文件,而不寫文件時使用,這時,私有映射更加高效。 但是,任何對私有映射頁的寫操作都會導致內核停止映射該文件中的頁。所以,寫操作既不會改變磁盤上的文件,對訪問該文件的其它進程也是不可見的。

 

共 享內存中的頁通常都位於page cache,私有內存映射只要沒有修改,也位於page cache。當進程試圖修改一個私有映射內存頁時,內核就把該頁進行復制,並在頁表中用複製的頁替換原來的頁。由於修改了頁表,儘管原來的頁仍然在 page cache,但是已經不再屬於該內存映射。而新複製的頁也不會插入page 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)以頁面形式緩存了文件系統的文件,給需要使用的程序讀取,它是爲了給讀操作提供緩衝,避免頻繁讀硬盤,提高讀取效率。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章