free中buffer 與 cache 的區別


通常人們所說的Cache就是指緩存SRAM。 SRAM叫靜態內存,“靜態”指的是當我們將一筆數據寫入SRAM后,除非重新寫入新數據或關閉電源,否則寫入的數據保持不變。 

由於CPU的速度比內存和硬盤的速度要快得多,所以在存取數據時會使CPU等待,影響計算機的速度。SRAM的存取速度比其它內存和硬盤都要快,所以它被用作電腦的高速緩存(Cache)。

Buffer從英文直譯過來的意思是“緩沖區”,這里我們將它稱為緩沖,因為它不僅是個名詞,還是個動詞。
緩沖區是存儲一系列的數據的地方,客戶端所獲得的數據可以從程序的執行結果直接輸出,也可以從緩沖區輸出。
但是這兩種方式在速度上是有差異的:在web中,當一個asp程序被請求的次數不多時,二者基本上沒有什么差異,至少我們感覺不出來。但是當有很多人請求一個asp程序時,速度可就不一樣了。
如果沒有緩沖區,那么每個請求asp程序的人的客戶端所得到的結果都是asp程序執行一次所得到的結果,而如果預先將asp程序緩沖,那么每個客戶端所得到的結果就是緩沖區的結果,不是執行一次程序的結果。比如有1000個用戶同時訪問一個asp頁面,如果這個asp程序沒有緩沖,那么程序將被執行一千次,這樣服務器的負荷就回加大,從而導致客戶端打開頁面速度變慢;如果這個asp程序被緩沖了,那么結果就不一樣了,每個客戶端直接從緩沖區獲得數據,服務器將不會因為訪問增加而增加程序執行次數,因此客戶端打開頁面的速度也就比上一種情況要快。這就是Buffer的好處。

先來說說free命令 

[root@server ~]# free -m 
total used free shared buffers cached 
Mem: 249 163 86 0 10 94 
-/+ buffers/cache: 58 191 
Swap: 511 0 511 

其中: 

total 內存總數 

used 已經使用的內存數 

free 空閑的內存數 

shared 多個進程共享的內存總額 

buffers Buffer Cache和cached Page Cache 磁盤緩存的大小 

-buffers/cache 的內存數:used - buffers - cached 

+buffers/cache 的內存數:free + buffers + cached 

可用的memory=free memory+buffers+cached 

有了這個基礎后,可以得知,我現在used為163MB,free為86,buffer和cached分別為10,94 

那么我們來看看,如果我執行復制文件,內存會發生什么變化. 

[root@server ~]# cp -r /etc ~/test/ 
[root@server ~]# free -m 
total used free shared buffers cached 
Mem: 249 244 4 0 8 174 
-/+ buffers/cache: 62 187 
Swap: 511 0 511 

在我命令執行結束后,used為244MB,free為4MB,buffers為8MB,cached為174MB,天吶都被cached吃掉了.別緊張,這是為了提高文件讀取效率的做法. 

引 用http://www.wujianrong.com/archives/2007/09/linux_free.html"為了提高磁盤存取效 率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還采取了兩種主要Cache方 式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,后者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用 (比如read,write,getdents)的時間。" 

那么有人說過段時間,linux會自動釋放掉所用的內存,我們使用free再來試試,看看是否有釋放>? 

[root@server test]# free -m 
total used free shared buffers cached 
Mem: 249 244 5 0 8 174 
-/+ buffers/cache: 61 188 
Swap: 511 0 511 

MS沒有任何變化,那么我能否手動釋放掉這些內存呢???回答是可以的! 

/proc 是一個虛擬文件系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通信的一種手段.也就是說可以通過修改/proc中的文件,來對當前 kernel的行為做出調整.那么我們可以通過調整/proc/sys/vm/drop_caches來釋放內存.操作如下: 

[root@server test]# cat /proc/sys/vm/drop_caches 

首先,/proc/sys/vm/drop_caches的值,默認為0 

[root@server test]# sync 

手動執行sync命令(描述:sync 命令運行 sync 子例程。如果必須停止系統,則運行 sync 命令以確保文件系統的完整性。sync 命令將所有未寫的系統緩沖區寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件) 

[root@server test]# echo 3 > /proc/sys/vm/drop_caches 
[root@server test]# cat /proc/sys/vm/drop_caches 

將/proc/sys/vm/drop_caches值設為3 

[root@server test]# free -m 
total used free shared buffers cached 
Mem: 249 66 182 0 0 11 
-/+ buffers/cache: 55 194 
Swap: 511 0 511 

再來運行free命令,發現現在的used為66MB,free為182MB,buffers為0MB,cached為11MB.那么有效的釋放了buffer和cache. 
————————————————

linux 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.
兩者都是RAM中的數據。簡單來說,buffer(緩沖)是即將要被寫入磁盤的,而cache(緩存)是被從磁盤中讀出來的

緩沖(buffers)
緩沖區,一個用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據
的區域。通過緩沖區,可以使進程之間的相互等待變少,從而使從速度慢的設備讀入數據 時,
速度快的設備的操作進程不發生間斷

是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。linux有一個守護進程定期清空緩沖內容(即寫磁盤),也可以通過sync命令手動清空緩沖。舉個例子吧:我這里有一個ext2的U盤,我往里面cp一個3M的 MP3,但U盤的燈沒有跳動,過了一會兒(或者手動輸入sync)U盤的燈就跳動起來了。卸載設備時會清空緩沖,所以有些時候卸載一個設備時要等上幾秒鍾。

緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤

其實這緩存內存(Cache Memory)在你需要使用內存的時候會自動釋放,所以你不必擔心沒有 內存可用。
如果你希望手動去釋放Cache Memory也是可以的

如何手工釋放Cache Memory(緩存內存), 用下面的命令可以釋放Cache Memory:
To free pagecache
     $sync; echo 1>/proc/sys/vm/drop_caches
To free dentries and inodes:  
     $sync; echo 2>/proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
     $sync; echo 3>/proc/sys/vm/drop_caches
注意,釋放前最好sync一下,防止丟失數據。

2. 解釋 free 命令
free命令中的buffer和cache:(它們都是占用內存):
       buffer : 作為buffer cache的內存,是塊設備的讀寫緩沖區
       cache: 作為page cache的內存, 文件系統的cache


#這個命令行用來調查誰在加數據入page_cache
[root@my031045 ~]# stap -e 'probe vfs.add_to_page_cache {printf("dev=%d, devname=%s, ino=%d, index=%d, nrpages=%d/n", dev, devname, ino, index, nrpages )}'
...
dev=2, devname=N/A, ino=0, index=2975, nrpages=1777


  $ free

      total                used                 free                   shared               buffers             cached  
Mem: 255268               238332               16936                       0               85540               126384
-/+ buffers/cache:        26408                228860
Swap: 265000              0                    265000

  Mem:表示物理內存統計

  -/+ buffers/cached:表示物理內存的緩存統計
  Swap:表示硬盤上交換分區的使用情況,這里我們不去關心。
  系統的總物理內存:255268Kb(256M),但系統當前真正可用的內存b並不是第一行free 標記的 16936Kb,它僅代表未被分配的內存。
  我們使用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
可見,used2 是真正使用的, 比used1 小, used1 包含分配但未使用內存。
      free2 是真正可使用的。比free1 大,free1 未包含分配但未使用內存
實驗:
讀程序  看cache 會越來越大
寫程序  看buffer 會越來越大

————————————————
版權聲明:本文為CSDN博主「hejinjing_tom_com」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hejinjing_tom_com/article/details/12199759


免責聲明!

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



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