標籤:
Linux記憶體機制-Cache與Buffer
在linux中經常發現空閑記憶體很少,似乎所有的記憶體都被系統佔用了,表面感覺記憶體不夠用了,其實不然。這是Linux記憶體管理的一個優秀特性,在這方面,區別於windows的記憶體管理。主要特點是,無論實體記憶體有多大,linux都將其充分利用,將一些程式調用過的硬碟資料讀入記憶體,利用記憶體讀寫的高速特性來提高Linux系統的資料訪問效能。而windows是只在需要記憶體時,才為應用程式分配記憶體,並不能充分利用大容量的記憶體空間。換句話說,每增加一些實體記憶體,Linux都將能充分利用起來,發揮了硬體投資帶來的好處,而windows只將其做為擺設,即使增加8GB甚至更大。
Linux的這一特性,主要是利用閒置實體記憶體,劃分出一部分空間,做為cache和buffers,以此提高資料訪問效能。
1、 什麼是cache?
頁面快取(cache)是linux核心實現的一種主要磁碟緩衝。它主要用來減少對磁碟I/0操作。具體地將,是通過把磁碟中的資料緩衝到實體記憶體中,把對磁碟的訪問變為對實體記憶體的訪問。
磁碟快取的價值在於兩個方面:第一,訪問磁碟的速度要遠遠低於訪問記憶體的速度,因此,從記憶體訪問資料比從磁碟訪問速度更快。第二,資料一旦被訪問,就很有可能在短期內再次被訪問到。
頁面快取是由記憶體中的物理頁組成的,緩衝中每一頁都對應著磁碟中的多個塊。每當核心開始執行一個頁I/O操作時(通常是對普通檔案中頁大小的塊進行磁碟操作),首先會檢查需要的資料是否在快取中,如果在,那麼核心就直接使用快取中的資料,從而避免訪問磁碟。
舉個例子,當使用文字編輯器開啟一個來源程式檔案時,改檔案的資料就被調入記憶體。編輯該檔案的過程中,越來越多的資料會相繼被調入記憶體頁。最後,當你編譯它的時候,核心可以直接使用頁快取中的頁,而不需要重新從磁碟讀取該檔案了。因為使用者往往反反覆複讀取或操作同一個檔案,所以頁快取能減少大量的磁碟操作。
2、 cache如何更新?
由於頁快取的緩衝作用,寫操作實際上會被延遲。當頁快取中的資料比後台儲存的資料更新時,那麼該資料就被稱做髒資料。在記憶體中累積起來的髒頁最終必須被寫回磁碟。在以下兩種情況發生時,髒頁被寫回磁碟:
當空閑記憶體低於一個特定的閾值是,核心必須將髒頁寫回磁碟,以便釋放記憶體。
當髒頁在記憶體中駐留時間超過一個特定閾值時,核心必須將逾時的髒頁寫回磁碟,以確保髒頁不會無限期地駐留在記憶體中。
在2.6核心中,由一群核心線程——pdflush後台回寫進程統一執行兩種工作。
首先,pdflush線程在系統中的空閑記憶體低於一個特定的閾值時,將髒頁重新整理回磁碟。改後台會寫進程的目的在於在可用實體記憶體過低時,釋放髒頁以重新獲得記憶體。特定的記憶體閾值可以通過dirty_background_ratio sysctl系統調用設定。當空閑記憶體比閾值:dirty_background_ratio還低時,核心便會調用函數wakeup_bdflush()喚醒一個pdflush線程,隨後pdflush線程進一步調用函數background_writeout()開始將髒頁寫回磁碟。函數background_writeout()需要一個長整形參數,改參數指定試圖寫回的頁面數目。函數background_writeout()會連續地寫回資料,指定滿足以下兩個條件:
已經有指定的最小數目的頁被寫出磁碟。
空閑記憶體數已經回升,超過了閾值dirty_background_ratio。
上述條件確保了pdflush操作可以減輕系統中記憶體不足的壓力。回寫操作不會在達到這兩個條件前停止,除非pdflush寫回了所有的髒頁,沒有剩下的髒頁可再被寫回了。
為了滿足第二個目標,pdflush後台進程會被周期性喚醒(和空閑記憶體是否過低無關),將那些記憶體中駐留時間過長的髒頁寫出,確保記憶體中不會有長期存在的髒頁。如果系統發生崩潰,由於記憶體處於混亂之中,所以那些在記憶體中還沒來得及寫回磁碟的髒頁就會丟失,所以周期性同步頁快取和磁碟非常重要。在系統啟動時,核心初始化一個定時器,讓它周期地喚醒pdflush線程,隨後使其運行函數wb_kupdate()。
Cache跟buffer的區別:
Cache:快取,是位於CPU與主記憶體間的一種容量較小但速度很高的儲存區。由於CPU的速度遠高於主記憶體,CPU直接從記憶體中存取資料要等待一定時間周期,cache中儲存著CPU剛用過或迴圈使用的一部分資料,當CPU再次使用該部分資料時可從cache中直接調用,這樣就減少了CPU的等待時間,提供了系統的效率。
Buffer:緩衝區,一個用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的地區。通過緩衝區,可以使進程之間的相互等待變少,從而使從速度慢的裝置讀入資料時,速度快的裝置的操作進程不發生間斷。
Free命令輸出中的buffer和cache: (它們都是佔用記憶體):
Buffer:作為buffer cache的記憶體,是塊裝置的讀寫緩衝區
Cache:作為page cache的記憶體,檔案系統的cache
如果cache的值很大,說明cache住的檔案數很多,如果頻繁訪問到的檔案都能被cache住,那麼磁碟的讀IO bi會非常小。
A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.
Buffer用來臨時存需要被寫到硬碟的資料
Cache用來臨時從硬碟上讀取的資料,這個資料是最近經常被用到的
Cache更多的時候是用來讀的,buffer是用來寫的
關於linux下記憶體使用量的一些疑惑[轉載]