Buffer 和 Cache 的定義:
-
Buffer:是原始磁盤塊的臨時存儲,即將緩存數(shù)據(jù)寫入磁盤。它通常不會很大(大約 20MB)。這樣,內(nèi)核就可以將分散的寫入集中起來,從而對磁盤寫入進行統(tǒng)一優(yōu)化。例如,多個小的寫入可以合并為一個大的寫入等。
-
Cache:是用于從磁盤讀取文件的頁面緩存,用于緩存從文件中讀取的數(shù)據(jù)。這樣,下次訪問這些文件數(shù)據(jù)時,可以直接從內(nèi)存中快速取回,而無需再次訪問緩慢的磁盤。
但是讓我問你,由于 Buffer 只是將寫入磁盤的數(shù)據(jù)的緩存。反過來,它還會緩存從磁盤讀取的數(shù)據(jù)嗎?或者 Cache 是從文件中讀取數(shù)據(jù)的緩存,那么它是否也為寫入文件緩存數(shù)據(jù)呢?
如果你能回答以上兩個問題,你可以跳過這篇文章,我想你已經(jīng)對 Buffer 和 Cache 有了很好的理解。但如果你不能,請留下來看看我的進一步解釋。
free 命令
要檢查系統(tǒng)內(nèi)存使用情況,您想到的第一個命令可能是 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
的手冊頁中的 Buffer 和 Cache 定義:
buffers
Memoryusedbykernelbuffers(Buffersin/proc/meminfo)
cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimablein/proc/meminfo)
buff/cache
Sumofbuffersandcache
我們可以看到 free
命令的源數(shù)據(jù)實際上存儲在 proc/meminfo
文件中。正如我前面提到的,/proc
是 Linux 內(nèi)核提供的一個特殊的文件系統(tǒng),它就像一個用戶與內(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.
至此,您可能認為您已經(jīng)找到了我的問題的答案,“Buffer”只是用于將數(shù)據(jù)寫入磁盤的緩存,“Cache”只是用于從文件中讀取數(shù)據(jù)的緩存。但事實上,“Buffer”也可以用于讀取,“Cache”也可以用于寫入。
實驗
我們將在這里做兩個實驗,寫緩存和讀緩存。
寫入 Cache
讓我們登錄到我們的 Linux 主機并準備好兩個終端。在終端 1,讓我們先清理緩存:

這里 /proc/sys/vm/drop_caches
是一個通過 proc
文件系統(tǒng)修改內(nèi)核行為的例子。寫入 3
意味著清理各種緩存,例如文件頁、目錄條目和 Inode。
仍然在終端 1,讓我們開啟 vmstat 2
命令:

-
buff
和cache
就是我們前面看到的 Buffer 和 Cache,單位是 KB。 -
bi
和bo
分別表示塊設(shè)備讀取和寫入的大小,以塊/s 為單位。由于 Linux 中的塊大小為 1KB,因此這個單位相當于 KB/s。
接下來,轉(zhuǎn)移到終端 2 并運行以下命令:

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

通過觀察 vmstat
的輸出,我們發(fā)現(xiàn)運行 dd
命令時,Cache 一直在增長,而 Buffer 基本沒有變化。
讀取 Buffer
現(xiàn)在,讓我們做第二個實驗。再次清除終端 1中的緩存:

同樣在終端 1 中,再次啟動 vmstat 2
命令:

您可以看到此時 buff
為 0
?,F(xiàn)在在終端 2 中,運行以下命令:

然后,回到終端 1 觀察:

觀察 vmstat
的輸出,你會發(fā)現(xiàn)在讀盤的時候(也就是 bi
> 0
的時候),Buffer 和 Cache 都在增長,但是顯然 Buffer 的增長要快很多。這意味著當從磁盤讀取時,數(shù)據(jù)被緩存在 Buffer 中。
現(xiàn)在我們幾乎可以得出結(jié)論:
讀取文件時數(shù)據(jù)會緩存在 Cache 中,讀取磁盤時數(shù)據(jù)會緩存在 Buffer 中。
結(jié)論
在這里您應該會發(fā)現(xiàn),雖然本文對 Buffer 和 Cache 進行了描述,但仍然無法涵蓋所有細節(jié)。我們?nèi)缃駥W到了以下兩點:
- Buffer:既可以用作“要寫入磁盤的數(shù)據(jù)緩存”,也可以用作“讀取磁盤讀的數(shù)據(jù)緩存”。
- Cache:既可以用作“從讀取文件的頁面緩存”,也可以用作“寫入文件的頁面緩存”。
審核編輯 :李倩
-
磁盤
+關(guān)注
關(guān)注
1文章
390瀏覽量
25840 -
buffer
+關(guān)注
關(guān)注
2文章
120瀏覽量
30633 -
命令
+關(guān)注
關(guān)注
5文章
737瀏覽量
22890
原文標題:Linux 內(nèi)存中的緩沖區(qū)(Buffer)與緩存(Cache)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32H7的MPU配置與D-Cache沖突如何解決???
如何在NXP MCU上啟用D-Cache?
請問驚鴻7110是否支持cache維護指令?
馬達的基本定義
ADS1256EVM開發(fā)板使能buffer后采集不正常是怎么回事?
什么是緩存(Cache)及其作用
請問ADS1256在BUFFER ON狀態(tài)下的輸入偏置電流是多少?
Cache和內(nèi)存有什么區(qū)別
MSPM0 UART通信中DMA和Ring Buffer環(huán)形緩沖的應用

解析Arm Neoverse N2 PMU事件L2D_CACHE_WR

評論