【linux】free命令中cached和buffers的區別

来源:http://www.cnblogs.com/chenpingzhao/archive/2016/01/26/5161844.html
-Advertisement-
Play Games

一、命令[root@localhost ~]# free -m total used free shared buffers cachedMem: 7869 7651 218 ...


一、命令

[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7869       7651        218          1        191       5081
-/+ buffers/cache:       2378       5490 
Swap:          478        139        339

二、計算

這裡使用1、2 分別代表第一行和第二行的數據

total1:表示物理 記憶體總量
used1:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用
free1:未被分配的記憶體
shared1:共用記憶體,一般系統不會用到,這裡也不討論
buffers1: 系統分配但未被使用的buffers 數量
cached1:系統分配但未被使用的cache 數量
used2:實際使用的buffers 與cache 總量,也是實際使用的記憶體總量
free2:未被 使用的buffers 與cache 和未被分配的記憶體之和,這就是系統當前實際可用記憶體

可以整理出如下等式

total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 + used2
free2 = buffers1 + cached1 + free1

具體計算

7869 = 7651 + 218
7869 = 2378 + 5490  #7868基本相等,因為有shared)
7651 = 191 + 5081 + 2378 #7650 基本相等,因為有shared)
5490 = 191 + 5081 + 218

為什麼這樣計算呢,因為buffers和cache其實也是記憶體的一部分,這部分特殊的記憶體是可以回收的,甚至如果需要我們還可以將這部分buffers和cache給釋放出來

三、區別

1、page cahe和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。 

補充一點,在文件系統層每個設備都會分配一個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,僅此而已。 

2、cache 和 buffer的區別

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 ; 對於共用記憶體(Shared memory),主要用於在UNIX 環境下不同進程之間共用數據,是進程間通信的一種方法,一般的應用程式不會申請使用共用記憶體

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

它是根據程式的局部性原理而設計的,就是cpu執行的指令和訪問的數據往往在集中的某一塊,所以把這塊內容放入cache後,cpu就不用在訪問記憶體了,這就提高了訪問速度。當然若cache中沒有cpu所需要的內容,還是要訪問記憶體的

查看CPU的 L1、L2、L3

[root@AY1301180424258d59678 ~]# ll /sys/devices/system/cpu/cpu0/cache/ 
total 0
drwxr-xr-x 2 root root 0 Jan 26 22:49 index0 #一級cache中的data和instruction cache
drwxr-xr-x 2 root root 0 Jan 26 22:49 index1 #一級cache中的data和instruction cache
drwxr-xr-x 2 root root 0 Jan 26 22:49 index2 #二級cache,共用的
drwxr-xr-x 2 root root 0 Jan 26 22:49 index3 #三級cache,共用的 

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

3、Free中的buffer和cache (它們都是占用記憶體)基於記憶體的

buffer :作為buffer cache的記憶體,是塊設備的讀寫緩衝區 

cache:作為page cache的記憶體, 文件系統的cache 

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

如何釋放Cache Memory

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

#註意,釋放前最好sync一下,防止丟失數據,但是一般情況下沒有必要手動釋放記憶體

4、總結

cached是cpu與記憶體間的,buffer是記憶體與磁碟間的,都是為瞭解決速度不對等的問題

  • 緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬碟了,若沒有命中就讀硬碟。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往後排,直至從中刪除

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

  • 修改/etc/sysctl.conf中的vm.swappiness右邊的數字可以在下次開機時調節swap使用策略。該數字範圍是0~100,數字越大越傾向於使用swap。預設為60,可以改一下試試。–兩者都是RAM中的數據

buffer是即將要被寫入磁碟的,而cache是被從磁碟中讀出來的  
  • buffer是由各種進程分配的,被用在如輸入隊列等方面。一個簡單的例子如某個進程要求有多個欄位讀入,在所有欄位被讀入完整之前,進程把先前讀入的欄位放在buffer中保存

  • cache經常被用在磁碟的I/O請求上,如果有多個進程都要訪問某個文件,於是該文件便被做成cache以方便下次被訪問,這樣可提高系統性能

  • Buffer Cachebuffer cache,又稱bcache,其中文名稱為緩衝器高速緩衝存儲器,簡稱緩衝器高緩。另外,buffer cache按照其工作原理,又被稱為塊高緩


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是單例模式 1.單例模式是一個類在系統中只有一個實例對象。通過全局的一個入口點對這個實例對象進行訪問。在 iOS 開發中,單例模式是非常有用的一種設計模式。如 下圖,是一個簡單單例模式的 UML 類圖。 2.iOS SDK 中也有許多類使用了單例模式,例如,UIApplication:當程式啟動...
  • 利用分類,NSString,增加一個方法。#import #import @interface NSString (Height)+ (CGSize)getRect:(NSString *)textStr andWidth:(CGSize)size andFont:(UIFont *)font;@e...
  • SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。在以前的文章里我們看到,SQL Server代理由一系列的作業步驟組成,每個作業步驟是要進行的不同工作類型。SQL Server代理也提供創建警...
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】A 代碼生成器(開發利器); 增刪改查的處理類,service層,mybatis的xml,SQL( mysql 和oracle)腳本, jsp頁面 都生成 就不用寫搬磚的代碼了,生成的放到項目里,可以直接運行B 阿裡巴巴資料庫連接池dr....
  • 一、簡介Redis是一種高級key-value資料庫,數據可以持久化,支持的數據類型很豐富,有字元串,哈希,鏈表,集合和有序集合5種數據類型Redis支持在伺服器端計算集合的並,交和補集(difference)等,還支持多種排序功能,所以Redis也可以被看成是一個數據結構伺服器Redis的所有數據...
  • 安裝首先是下載,地址奉上:http://www.google.cn/chrome/browser/desktop/index.html,選擇64 bit .rpm (適用於 Fedora/openSUSE) ,當然如果你是32位系統那麼你可以選擇32 bit .rpm (適用於 Fedora/ope...
  • 這是一塊便宜 (¥12.5)的 WiFi 模塊,3.3V ,晶元是樂鑫科技(Espressif)出品。它本身是很多玩法,比如這個 NodeMCU (淘寶有套件焊接好一整套的帶 USB 介面的,搜 esp8266 nodemcu)。 我這是沒多久之前買的。要買的話,多幾塊錢可以有更完整引腳的版本,樂鑫...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...