0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Buffer和Cache的定義

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-05-13 09:53 ? 次閱讀

BufferCache 的定義:

  • Buffer:是原始磁盤塊的臨時(shí)存儲(chǔ),即將緩存數(shù)據(jù)寫入磁盤。它通常不會(huì)很大(大約 20MB)。這樣,內(nèi)核就可以將分散的寫入集中起來(lái),從而對(duì)磁盤寫入進(jìn)行統(tǒng)一優(yōu)化。例如,多個(gè)小的寫入可以合并為一個(gè)大的寫入等。

  • Cache:是用于從磁盤讀取文件的頁(yè)面緩存,用于緩存從文件中讀取的數(shù)據(jù)。這樣,下次訪問(wèn)這些文件數(shù)據(jù)時(shí),可以直接從內(nèi)存中快速取回,而無(wú)需再次訪問(wèn)緩慢的磁盤。

但是讓我問(wèn)你,由于 Buffer 只是將寫入磁盤的數(shù)據(jù)的緩存。反過(guò)來(lái),它還會(huì)緩存從磁盤讀取的數(shù)據(jù)嗎?或者 Cache 是從文件中讀取數(shù)據(jù)的緩存,那么它是否也為寫入文件緩存數(shù)據(jù)呢?

如果你能回答以上兩個(gè)問(wèn)題,你可以跳過(guò)這篇文章,我想你已經(jīng)對(duì) BufferCache 有了很好的理解。但如果你不能,請(qǐng)留下來(lái)看看我的進(jìn)一步解釋。

free 命令

要檢查系統(tǒng)內(nèi)存使用情況,您想到的第一個(gè)命令可能是 free ,例如:

$free-h
totalusedfreesharedbuff/cacheavailable
Mem:1.9G1.0G394M2.6M491M728M
Swap:0B0B0B

很明顯,該輸出包括了物理內(nèi)存 MemSwap 的具體使用情況(如總內(nèi)存、已用內(nèi)存、緩存、可用內(nèi)存等)。緩存是 BufferCache 兩部分的總和。

讓我們看一下 free 的手冊(cè)頁(yè)中的 BufferCache 定義:

buffers
Memoryusedbykernelbuffers(Buffersin/proc/meminfo)
cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimablein/proc/meminfo)
buff/cache
Sumofbuffersandcache

我們可以看到 free 命令的源數(shù)據(jù)實(shí)際上存儲(chǔ)在 proc/meminfo 文件中。正如我前面提到的,/procLinux 內(nèi)核提供的一個(gè)特殊的文件系統(tǒng),它就像一個(gè)用戶與內(nèi)核交互的接口。

/proc 文件系統(tǒng)也是許多性能工具的最終數(shù)據(jù)源。在 man proc 中,BuffersCached 的定義如下:

Buffers%lu
Relativelytemporarystorageforrawdiskblocksthatshouldn'tgettremendouslylarge(20MBorso).
Cached%lu
In-memorycacheforfilesreadfromthedisk(thepagecache).Doesn'tincludeSwapCached.
...
SReclaimable%lu(sinceLinux2.6.19)
PartofSlab,thatmightbereclaimed,suchascaches.

SUnreclaim%lu(sinceLinux2.6.19)
PartofSlab,thatcannotbereclaimedonmemorypressure.

至此,您可能認(rèn)為您已經(jīng)找到了我的問(wèn)題的答案,“Buffer”只是用于將數(shù)據(jù)寫入磁盤的緩存,“Cache”只是用于從文件中讀取數(shù)據(jù)的緩存。但事實(shí)上,“Buffer”也可以用于讀取,“Cache”也可以用于寫入。

實(shí)驗(yàn)

我們將在這里做兩個(gè)實(shí)驗(yàn),寫緩存和讀緩存。

寫入 Cache

讓我們登錄到我們的 Linux 主機(jī)并準(zhǔn)備好兩個(gè)終端。在終端 1,讓我們先清理緩存

c2f2f4ae-d25e-11ec-bce3-dac502259ad0.png

這里 /proc/sys/vm/drop_caches 是一個(gè)通過(guò) proc 文件系統(tǒng)修改內(nèi)核行為的例子。寫入 3 意味著清理各種緩存,例如文件頁(yè)、目錄條目和 Inode。

仍然在終端 1,讓我們開(kāi)啟 vmstat 2 命令:

c3058236-d25e-11ec-bce3-dac502259ad0.png
  • buffcache 就是我們前面看到的 BufferCache,單位是 KB。
  • bibo 分別表示塊設(shè)備讀取和寫入的大小,以塊/s 為單位。由于 Linux 中的塊大小為 1KB,因此這個(gè)單位相當(dāng)于 KB/s。

接下來(lái),轉(zhuǎn)移到終端 2 并運(yùn)行以下命令:

c31a58e6-d25e-11ec-bce3-dac502259ad0.png

現(xiàn)在切換回終端 1,并觀察 buffcache 的變化:

c32ecd6c-d25e-11ec-bce3-dac502259ad0.png

通過(guò)觀察 vmstat 的輸出,我們發(fā)現(xiàn)運(yùn)行 dd 命令時(shí),Cache 一直在增長(zhǎng),而 Buffer 基本沒(méi)有變化。

讀取 Buffer

現(xiàn)在,讓我們做第二個(gè)實(shí)驗(yàn)。再次清除終端 1中的緩存

c34774d4-d25e-11ec-bce3-dac502259ad0.png

同樣在終端 1 中,再次啟動(dòng) vmstat 2 命令:

c36567fa-d25e-11ec-bce3-dac502259ad0.png

您可以看到此時(shí) buff0。現(xiàn)在在終端 2 中,運(yùn)行以下命令:

c37f4dc8-d25e-11ec-bce3-dac502259ad0.png

然后,回到終端 1 觀察:

c3991460-d25e-11ec-bce3-dac502259ad0.png

觀察 vmstat 的輸出,你會(huì)發(fā)現(xiàn)在讀盤的時(shí)候(也就是 bi > 0 的時(shí)候),BufferCache 都在增長(zhǎng),但是顯然 Buffer 的增長(zhǎng)要快很多。這意味著當(dāng)從磁盤讀取時(shí),數(shù)據(jù)被緩存在 Buffer 中。

現(xiàn)在我們幾乎可以得出結(jié)論:

讀取文件時(shí)數(shù)據(jù)會(huì)緩存在 Cache 中,讀取磁盤時(shí)數(shù)據(jù)會(huì)緩存在 Buffer 中。

結(jié)論

在這里您應(yīng)該會(huì)發(fā)現(xiàn),雖然本文對(duì) BufferCache 進(jìn)行了描述,但仍然無(wú)法涵蓋所有細(xì)節(jié)。我們?nèi)缃駥W(xué)到了以下兩點(diǎn):

  • Buffer:既可以用作“要寫入磁盤的數(shù)據(jù)緩存”,也可以用作“讀取磁盤讀的數(shù)據(jù)緩存”。
  • Cache:既可以用作“從讀取文件的頁(yè)面緩存”,也可以用作“寫入文件的頁(yè)面緩存”。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 磁盤
    +關(guān)注

    關(guān)注

    1

    文章

    355

    瀏覽量

    25096
  • buffer
    +關(guān)注

    關(guān)注

    2

    文章

    120

    瀏覽量

    29914
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    658

    瀏覽量

    21931

原文標(biāo)題:Linux 內(nèi)存中的緩沖區(qū)(Buffer)與緩存(Cache)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenHarmony語(yǔ)言基礎(chǔ)類庫(kù)【@ohos.buffer (Buffer)】

    Buffer對(duì)象用于表示固定長(zhǎng)度的字節(jié)序列,是專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。
    的頭像 發(fā)表于 04-23 17:34 ?735次閱讀
    OpenHarmony語(yǔ)言基礎(chǔ)類庫(kù)【@ohos.<b class='flag-5'>buffer</b> (<b class='flag-5'>Buffer</b>)】

    請(qǐng)問(wèn)MINI54 SPI BUFFER怎么用?

    各位前輩,我想請(qǐng)問(wèn)一下,MINI 54 SPI BUFFER 怎么使用?比如怎么定義,怎么引用。哪位可以告訴我一下,不勝感激。
    發(fā)表于 01-17 08:08

    buffercache的區(qū)別

    buffercache的區(qū)別 緩沖區(qū)(Buffer)和緩存(Cache)是計(jì)算機(jī)系統(tǒng)中用于提高數(shù)據(jù)讀寫效率的兩個(gè)關(guān)鍵概念,它們雖然功能有所重疊,但在實(shí)際應(yīng)用中存在一些差異。在下文中,
    的頭像 發(fā)表于 12-07 11:00 ?687次閱讀

    什么是always on buffer?什么情況下需要插always on buffer?

    相比普通的buffer cell,always on buffer(AOB)有secondary always on pin,可以讓AOB即使在primary power off的情況下保持on的狀態(tài);AOB在secondary pg pin off的情況下也是off的。
    的頭像 發(fā)表于 12-01 15:31 ?1892次閱讀
    什么是always on <b class='flag-5'>buffer</b>?什么情況下需要插always on <b class='flag-5'>buffer</b>?

    Cache和Write Buffer一般性介紹

    Cache是位于CPU與主存儲(chǔ)器即DRAM(Dynamic RAM,動(dòng)態(tài)存儲(chǔ)器)之間的少量超高速靜態(tài)存儲(chǔ)器SRAM(Static RAM)
    的頭像 發(fā)表于 10-31 15:07 ?536次閱讀
    <b class='flag-5'>Cache</b>和Write <b class='flag-5'>Buffer</b>一般性介紹

    Cache替換策略和Write-through介紹

    Cache和存儲(chǔ)器一樣具有兩種基本操作,即讀操作和寫操作。當(dāng)CPU發(fā)出讀操作命令時(shí),根據(jù)它產(chǎn)生的主存地址分為兩種情形:一種是需要的數(shù)據(jù)已在Cache中,那么只需要直接訪問(wèn)Cache,從對(duì)應(yīng)單元中讀取
    的頭像 發(fā)表于 10-31 11:48 ?1295次閱讀

    Cache寫入方式原理簡(jiǎn)介

    提高高速緩存命中率的最好方法是盡量使Cache存放CPU最近一直在使用的指令與數(shù)據(jù),當(dāng)Cache裝滿后,可將相對(duì)長(zhǎng)期不用的數(shù)據(jù)刪除,提高Cache的使用效率。 為保持Cache中數(shù)據(jù)與
    的頭像 發(fā)表于 10-31 11:43 ?1033次閱讀

    Cache工作原理是什么

    具有Cache的計(jì)算機(jī),當(dāng)CPU需要進(jìn)行存儲(chǔ)器存取時(shí),首先檢查所需數(shù)據(jù)是否在Cache中。如果存在,則可以直接存取其中的數(shù)據(jù)而不必插入任何等待狀態(tài),這是最佳情況,稱為高速命中; 當(dāng)CPU所需信息不在
    的頭像 發(fā)表于 10-31 11:34 ?762次閱讀
    <b class='flag-5'>Cache</b>工作原理是什么

    Cache內(nèi)容鎖定是什么

    “鎖定”在cache中的塊在常規(guī)的cache替換操作中不會(huì)被替換,但當(dāng)通過(guò)C7控制cache中特定的塊時(shí),比如使某特定的塊無(wú)效時(shí),這些被“鎖定”在cache中的塊也將受到相應(yīng)的影響。
    的頭像 發(fā)表于 10-31 11:31 ?602次閱讀

    Cache分類與替換算法

    根據(jù)不同的分類標(biāo)準(zhǔn)可以按以下3種方法對(duì)Cache進(jìn)行分類。 ?1)數(shù)據(jù)cache和指令cache ?● 指令cache:指令預(yù)取時(shí)使用的cache
    的頭像 發(fā)表于 10-31 11:26 ?766次閱讀
    <b class='flag-5'>Cache</b>分類與替換算法

    Cache的原理和地址映射

    cache存儲(chǔ)系統(tǒng)中,把cache和主存儲(chǔ)器都劃分成相同大小的塊。 主存地址由塊號(hào)B和塊內(nèi)地址W兩部分組成,cache地址由塊號(hào)b和塊內(nèi)地址w組成。 當(dāng)CPU訪問(wèn)cache時(shí),CPU
    的頭像 發(fā)表于 10-31 11:21 ?1295次閱讀

    Cache為什么還要分I-Cache,D-Cache,L2 Cache,作用是什么?

    Cache為什么還要分I-Cache,D-Cache,L2 Cache,作用是什么?
    發(fā)表于 10-25 06:38

    看看ARM處理器存儲(chǔ)訪問(wèn)一致性問(wèn)題

    當(dāng)存儲(chǔ)系統(tǒng)中引入了cache和寫緩沖區(qū)(Write Buffer)時(shí),同一地址單元的數(shù)據(jù)可能在系統(tǒng)中有多個(gè)副本,分別保存在cache、Write Buffer及主存中,如果系統(tǒng)采用了獨(dú)
    發(fā)表于 10-17 17:35 ?872次閱讀
    看看ARM處理器存儲(chǔ)訪問(wèn)一致性問(wèn)題

    Python 中怎么來(lái)實(shí)現(xiàn)類似 Cache 的功能

    cachetools,這是一個(gè)可擴(kuò)展的基于內(nèi)存的 Collections、Decorators 的封裝實(shí)現(xiàn)。 因?yàn)槭?Cache,那么就一定有它的頁(yè)面置換算法。根據(jù)操作系統(tǒng)學(xué)過(guò)的一些知識(shí),置換
    的頭像 發(fā)表于 10-17 10:47 ?576次閱讀

    在組相聯(lián)cache中,用于替換cache line的算法有哪些?

    LRU(Least Recently Used)算法:該算法會(huì)跟蹤每個(gè)cache line的age(年齡)情況,并在需要時(shí)替換掉近期最少使用的cache line。
    的頭像 發(fā)表于 10-08 11:10 ?726次閱讀