Buffer 和 Cache 的定義:
-
Buffer:是原始磁盤(pán)塊的臨時(shí)存儲(chǔ),即將緩存數(shù)據(jù)寫(xiě)入磁盤(pán)。它通常不會(huì)很大(大約 20MB)。這樣,內(nèi)核就可以將分散的寫(xiě)入集中起來(lái),從而對(duì)磁盤(pán)寫(xiě)入進(jìn)行統(tǒng)一優(yōu)化。例如,多個(gè)小的寫(xiě)入可以合并為一個(gè)大的寫(xiě)入等。
-
Cache:是用于從磁盤(pán)讀取文件的頁(yè)面緩存,用于緩存從文件中讀取的數(shù)據(jù)。這樣,下次訪(fǎng)問(wèn)這些文件數(shù)據(jù)時(shí),可以直接從內(nèi)存中快速取回,而無(wú)需再次訪(fǎng)問(wèn)緩慢的磁盤(pán)。
但是讓我問(wèn)你,由于 Buffer 只是將寫(xiě)入磁盤(pán)的數(shù)據(jù)的緩存。反過(guò)來(lái),它還會(huì)緩存從磁盤(pán)讀取的數(shù)據(jù)嗎?或者 Cache 是從文件中讀取數(shù)據(jù)的緩存,那么它是否也為寫(xiě)入文件緩存數(shù)據(jù)呢?
如果你能回答以上兩個(gè)問(wèn)題,你可以跳過(guò)這篇文章,我想你已經(jīng)對(duì) Buffer 和 Cache 有了很好的理解。但如果你不能,請(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)存 Mem
和 Swap
的具體使用情況(如總內(nèi)存、已用內(nèi)存、緩存、可用內(nèi)存等)。緩存是 Buffer 和 Cache 兩部分的總和。
讓我們看一下 free
的手冊(cè)頁(yè)中的 Buffer 和 Cache 定義:
buffers
Memoryusedbykernelbuffers(Buffersin/proc/meminfo)
cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimablein/proc/meminfo)
buff/cache
Sumofbuffersandcache
我們可以看到 free
命令的源數(shù)據(jù)實(shí)際上存儲(chǔ)在 proc/meminfo
文件中。正如我前面提到的,/proc
是 Linux 內(nèi)核提供的一個(gè)特殊的文件系統(tǒng),它就像一個(gè)用戶(hù)與內(nèi)核交互的接口。
/proc
文件系統(tǒng)也是許多性能工具的最終數(shù)據(jù)源。在 man proc
中,Buffers
和 Cached
的定義如下:
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ù)寫(xiě)入磁盤(pán)的緩存,“Cache”只是用于從文件中讀取數(shù)據(jù)的緩存。但事實(shí)上,“Buffer”也可以用于讀取,“Cache”也可以用于寫(xiě)入。
實(shí)驗(yàn)
我們將在這里做兩個(gè)實(shí)驗(yàn),寫(xiě)緩存和讀緩存。
寫(xiě)入 Cache
讓我們登錄到我們的 Linux 主機(jī)并準(zhǔn)備好兩個(gè)終端。在終端 1,讓我們先清理緩存:
![c2f2f4ae-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ceAGEv6AAA2gCYUVM4722.png)
這里 /proc/sys/vm/drop_caches
是一個(gè)通過(guò) proc
文件系統(tǒng)修改內(nèi)核行為的例子。寫(xiě)入 3
意味著清理各種緩存,例如文件頁(yè)、目錄條目和 Inode。
仍然在終端 1,讓我們開(kāi)啟 vmstat 2
命令:
![c3058236-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ceAYRkSAAA0CTQNpBM588.png)
-
buff
和cache
就是我們前面看到的 Buffer 和 Cache,單位是 KB。 -
bi
和bo
分別表示塊設(shè)備讀取和寫(xiě)入的大小,以塊/s 為單位。由于 Linux 中的塊大小為 1KB,因此這個(gè)單位相當(dāng)于 KB/s。
接下來(lái),轉(zhuǎn)移到終端 2 并運(yùn)行以下命令:
![c31a58e6-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ceANBtNAAApHl2Ym0U179.png)
現(xiàn)在切換回終端 1,并觀察 buff
和 cache
的變化:
![c32ecd6c-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ceAVRVJAABBmFiIgqc122.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](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ciAL-oyAAA3lnCvXyA218.png)
同樣在終端 1 中,再次啟動(dòng) vmstat 2
命令:
![c36567fa-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ciAE4BCAAAuuOr2kPw780.png)
您可以看到此時(shí) buff
為 0
?,F(xiàn)在在終端 2 中,運(yùn)行以下命令:
![c37f4dc8-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ciASrGdAAArVgmO8qg552.png)
然后,回到終端 1 觀察:
![c3991460-d25e-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/54/wKgZomTm_ciAGw7_AABDqpPIBjc237.png)
觀察 vmstat
的輸出,你會(huì)發(fā)現(xiàn)在讀盤(pán)的時(shí)候(也就是 bi
> 0
的時(shí)候),Buffer 和 Cache 都在增長(zhǎng),但是顯然 Buffer 的增長(zhǎng)要快很多。這意味著當(dāng)從磁盤(pán)讀取時(shí),數(shù)據(jù)被緩存在 Buffer 中。
現(xiàn)在我們幾乎可以得出結(jié)論:
讀取文件時(shí)數(shù)據(jù)會(huì)緩存在 Cache 中,讀取磁盤(pán)時(shí)數(shù)據(jù)會(huì)緩存在 Buffer 中。
結(jié)論
在這里您應(yīng)該會(huì)發(fā)現(xiàn),雖然本文對(duì) Buffer 和 Cache 進(jìn)行了描述,但仍然無(wú)法涵蓋所有細(xì)節(jié)。我們?nèi)缃駥W(xué)到了以下兩點(diǎn):
- Buffer:既可以用作“要寫(xiě)入磁盤(pán)的數(shù)據(jù)緩存”,也可以用作“讀取磁盤(pán)讀的數(shù)據(jù)緩存”。
- Cache:既可以用作“從讀取文件的頁(yè)面緩存”,也可以用作“寫(xiě)入文件的頁(yè)面緩存”。
審核編輯 :李倩
-
磁盤(pán)
+關(guān)注
關(guān)注
1文章
380瀏覽量
25293 -
buffer
+關(guān)注
關(guān)注
2文章
120瀏覽量
30137 -
命令
+關(guān)注
關(guān)注
5文章
697瀏覽量
22117
原文標(biāo)題:Linux 內(nèi)存中的緩沖區(qū)(Buffer)與緩存(Cache)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
什么是緩存(Cache)及其作用
Cache和內(nèi)存有什么區(qū)別
MSPM0 UART通信中DMA和Ring Buffer環(huán)形緩沖的應(yīng)用
![MSPM0 UART通信中DMA和Ring <b class='flag-5'>Buffer</b>環(huán)形緩沖的應(yīng)用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
解析Arm Neoverse N2 PMU事件L2D_CACHE_WR
![解析Arm Neoverse N2 PMU事件L2D_<b class='flag-5'>CACHE</b>_WR](https://file1.elecfans.com/web2/M00/05/F5/wKgaombWhaWAAQMZAABcOJk8riw523.jpg)
請(qǐng)教論壇大神Labview調(diào)用BlueSuite TestEngine.dll問(wèn)題
Cortex R52內(nèi)核Cache的具體操作(2)
![Cortex R52內(nèi)核<b class='flag-5'>Cache</b>的具體操作(2)](https://file1.elecfans.com/web2/M00/FC/94/wKgZomaU1E2AWljgAAAHVD5MO1Y922.png)
Cortex R52內(nèi)核Cache的相關(guān)概念(1)
![Cortex R52內(nèi)核<b class='flag-5'>Cache</b>的相關(guān)概念(1)](https://file1.elecfans.com/web2/M00/FD/61/wKgaomaUjEyAVf9TAABSu-5kKF4285.png)
CortexR52內(nèi)核Cache的具體操作
![CortexR52內(nèi)核<b class='flag-5'>Cache</b>的具體操作](https://file1.elecfans.com/web2/M00/FC/75/wKgZomaUis6AMjitAAAiibG6WqY593.png)
STM32的DAC輸出有個(gè)BUFFER功能,BUFFer的驅(qū)動(dòng)能力究竟有多大,普通的運(yùn)放輸出可以嗎?驅(qū)動(dòng)LED可以嗎?
OpenHarmony語(yǔ)言基礎(chǔ)類(lèi)庫(kù)【@ohos.buffer (Buffer)】
![OpenHarmony語(yǔ)言基礎(chǔ)類(lèi)庫(kù)【@ohos.<b class='flag-5'>buffer</b> (<b class='flag-5'>Buffer</b>)】](https://file1.elecfans.com/web2/M00/C9/99/wKgaomYeL0WAZFDHAAACSiKnE8w930.jpg)
評(píng)論