1. 程式人生 > 其它 >Linux系統中的Page cache和Buffer cache

Linux系統中的Page cache和Buffer cache

Linux系統中的Page cache和Buffer cache

Free命令顯示記憶體

首先,我們來了解下記憶體的使用情況

  • 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 ,當其他程式需要更多記憶體時,系統會減少cache大小。

 

Buffer page(緩衝頁)

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

 

Swap space(交換空間)

Swap space交換空間,是虛擬記憶體的表現形式。系統為了應付一些需要大量記憶體的應用,而將磁碟上的空間做記憶體使用,當實體記憶體不夠用時,將其中一些暫時不需的資料交換到交換空間,也叫交換檔案或頁面檔案中。做虛擬記憶體的好處是讓程序以為好像可以訪問整個系統實體記憶體。因為在一個程序訪問資料時,其他程序的資料會被交換到交換空間中。

 

Swap cache(交換快取)

swap cache,它表示交換快取的大小。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)以頁面形式快取了檔案系統的檔案,給需要使用的程式讀取,它是為了給讀操作提供緩衝,避免頻繁讀硬碟,提高讀取效率。