天天看點

Linux指令 之 free (buffer與cache差別 )

原文:http://zhumeng8337797.blog.163.com/blog/static/100768914201110244740147/    點選打開連結 從本質上講,     buffer(緩沖)是為了提高記憶體和硬碟(或其他I/O裝置)之間的資料交換的速度而設計的。 

    cache(緩存)是為了提高cpu和記憶體之間的資料交換速度而設計的,也就是平常見到的一級緩存、二級緩存、三級緩存。(top指令中檢視的cache不是指一級緩存/二級緩存/三級緩存,而是指Cache Memory)

buffer:    緩沖區,一個用于存儲速度不同步的裝置或優先級不同的裝置之間傳輸資料的區域。通過緩沖區,可以使程序之間的互相等待變少,進而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。 cache:    當你讀寫檔案的時候,Linux核心為了提高讀寫性能與速度,會将檔案在記憶體中進行緩存,這部分記憶體就是Cache Memory(緩存記憶體)。即使你的程式運作結束後,Cache Memory也不會自動釋放。這就會導緻你在Linux系統中程式頻繁讀寫檔案後,你會發現可用實體記憶體會很少。 其實這緩存記憶體(Cache Memory)在你需要使用記憶體的時候會自動釋放,是以你不必擔心沒有記憶體可用。 如果你希望手動去釋放Cache Memory也是有辦法的。

一、free指令

free 指令相對于top 提供了更簡潔的檢視系統記憶體使用情況,用來顯示記憶體的使用情況,使用權限是所有使用者

文法:

     free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]

常用參數詳解

-b, -k,-m,-g:分别以位元組( bytes、KB、MB、GB)為機關顯示記憶體使用情況

-s  delay:顯示每隔多少秒數來顯示一次記憶體使用情況(與-c一起使用)

-c:按每隔幾秒顯示記憶體使用情況時的重新整理次數(與-s一起使用)

-t:顯示記憶體總和列。

-o:不顯示緩沖區調節列

-V:free的版本

  # free -m

                   total       used     free     shared    buffers     cached

Mem:          3034      2938      96           0          101          1300

-/+ buffers/cache:   1536       1497

Swap:         1983      71        1912

Total:         5018       3010     2008

  Mem:表示實體記憶體統計

  -/+ buffers/cached:表示實體記憶體的緩存統計

  Swap:表示硬碟上交換分區的使用情況,這裡我們不去關心。

  系統的總實體記憶體:3034M,但系統目前真正可用的記憶體并不是第一行free 标記的 96M,它僅代表未被配置設定的記憶體。

  我們使用total1、used1、free1、used2、free2 等名稱來代表上面統計資料的各值,1、2 分别代表第一行和第二行的資料。

  total1:表示實體記憶體總量。

  used1:表示總計配置設定給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存并未實際使用。

  free1:未被配置設定的記憶體。

  shared1:共享記憶體,一般系統不會用到,這裡也不讨論。

  buffers1:系統配置設定但未被使用的buffers 數量。

  cached1:系統配置設定但未被使用的cache 數量。buffer 與cache 的差別見後面。

  used2:實際使用的buffers 與cache 總量,也是實際使用的記憶體總量。

  free2:未被使用的buffers 與cache 和未被配置設定的記憶體之和,這就是系統目前實際可用記憶體。

  可以整理出如下等式:

      total1 = used1 + free1

      total1 = used2 + free2

      used1 = buffers1 + cached1 + used2

      free2 = buffers1 + cached1 + free1

二、buffer與cache的差別

了解linux記憶體管理,需要深入了解linux記憶體的各個參數含義和規則,下面介紹一下Linux作業系統中記憶體buffer和cache的差別。

buffer 與cache 的差別:

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.

更詳細的解釋參考:Difference Between Buffer and Cache

Cache:高速緩存,是位于CPU與主記憶體間的一種容量較小但速度很高的存儲器。由于CPU的速度遠高于主記憶體,CPU直接從記憶體中存取資料要等待一定時間周期,Cache中儲存着CPU剛用過或循環使用的一部分資料,當CPU再次使用該部分資料時可從Cache中直接調用,這樣就減少了CPU的等待時間,提高了系統的效率。Cache又分為一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache內建在CPU内部,L2 Cache早期一般是焊在主機闆上,現在也都內建在CPU内部,常見的容量有256KB或512KB L2 Cache。

Buffer:緩沖區,一個用于存儲速度不同步的裝置或優先級不同的裝置之間傳輸資料的區域。通過緩沖區,可以使程序之間的互相等待變少,進而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。

Free中的buffer和cache:(它們都是占用記憶體):

buffer : 作為buffer cache的記憶體,是塊裝置的讀寫緩沖區

cache: 作為page cache的記憶體, 檔案系統的cache

如果 cache 的值很大,說明cache住的檔案數很多。如果頻繁通路到的檔案都能被cache住,那麼磁盤的讀IO bi會非常小。

對于共享記憶體(Shared memory),主要用于在UNIX 環境下不同程序之間共享資料,是程序間通信的一種方法,一般的應用程式不會申請使用共享記憶體,筆者也沒有去驗證共享記憶體對上面等式的影響。如果你有興趣,請參考:What is Shared Memory?

我們使用的Linux和Windows可不太一樣,用top指令得出來的可能不是真實使用的記憶體,用free指令第二行才是系統真實使用的記憶體。如 果發現PHP-CGI把你的記憶體占滿了可不要驚慌哦。

Page cache和buffer cache一直以來是兩個比較容易混淆的概念,在網上也有很多人在争辯和猜想這兩個cache到底有什麼差別,讨論到最後也一直沒有一個統一和正确的結 論,在我工作的這一段時間,page cache和buffer cache的概念曾經困擾過我,但是仔細分析一下,這兩個概念實際上非常的清晰。如果能夠了解到這兩個cache的本質,那麼我們在分析io問題的時候可 能會更加得心應手。

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。

補充一點,在檔案系統層 每個裝置都會配置設定一個def_blk_ops的檔案操作方法,這是裝置的操作方法,在每個裝置的inode下面會存在一個 radix tree,這個radix tree下面将會放置緩存資料的page頁。這個page的數量将會在top程式的buffer一欄中顯示。如果裝置做了檔案系統,那麼會生成一個 inode,這個inode會配置設定ext3_ops之類的操作方法,這些方法是檔案系統的方法,在這個inode下面同樣存在一個radix tree,這裡會緩存檔案的page頁,緩存頁的數量在top程式的cache一欄進行統計。從上面的分析可以看出,2.6核心中的buffer cache和page cache在處理上是保持一緻的,但是存在概念上的差别,page cache針對檔案的cache,buffer是針對磁盤塊資料的cache,僅此而已。

現在不都是隻有page cache了嗎? buffer pages其實也是page cache裡面的頁。隻是多了一層抽象,通過buffer_head來進行一些通路管理。對,從Linux算法實作的角度,page cache和buffer cache目前是一樣的,但是從功能抽象和具體應用來講,這兩者還是存在差別的,這一點可以從top工具的統計資訊中看得出來,關注一下buffer和 cache這兩個統計量。

增加一些資料:

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.