怎麼理解內存中的Buffer和Cache?

1|
0緩存

從 free 命令可以看到,緩存其實就是 Buffer 和 Cache 兩部分的總和字面意思,Buffer 是緩存區,Cache 是緩存,兩者都是數據再內存中的臨時存儲

2|0Buffer 和 Cache 的區別

<code>man free/<code>

執行上面的命令,可以從幫助手冊中看到 buffer 和 cache 說明

Buffers:內核緩衝區用到的內存,對應的是 /proc/meminfo 中的 BuffersCache:內核頁緩存和 Slab 用到的內存,對應的是 /proc/meminfo 中的 CachedSReclaimable 之和

注意事項

同一個指標的具體含義,就可能因為內核版本、性能工具版本的不同而有挺大差別所以百度 Buffer 和 Cache 什麼意思可能並不適用於你當前的環境所以可以通過下面說的 proc 文件系統來確認它們的含義

3|0proc 文件系統

再次回顧 proc

/proc 是 Linux 內核提供的一種特殊文件系統,是用戶跟內核交互的接口比方說,用戶可以從 /proc 中查詢內核的運行狀態和配置選項, 查詢進程的運行狀態、統計數據等,也可以通過 /proc 來修改內核的配置proc 文件系統同時也是很多性能工具的最終數據來源

3|1瞭解 Buffer 和 Cache

查看幫助文檔,找到它們

<code>man proc/<code>

Buffers

原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,通常不會特別大 (20MB 左右)內核就可以把分散的寫集中起來,
統一優化磁盤的寫入,比如,可以把多次小的寫合併成單次大的寫等等

Cached

從磁盤讀取文件的頁緩存,也就是用來緩存從文件讀取的數據這樣,下次訪問這些文件數據時,就可以直接從內存中快速獲取,而不需要再次訪問緩慢的磁盤。

SReclaimable

是 Slab 的一部分Slab 包括兩部分,其中的可回收部分,用 SReclaimable 記錄;而不可回收部分,用 SUnreclaim 記錄

靈魂拷問

Buffers 能不能緩存磁盤中
的數據?Cached 能不能緩存磁盤中的數據?

為了驗證上面的問題,會通過案例來展開描述

4|0Buffer 和 Cache 在不同場景下的使用情況

系統配置

操作系統:Ubuntu 18.04機器配置:2 CPU,8GB 內存預先安裝 sysstat 包 apt install sysstat 打開兩個終端連接到 Ubuntu 系統上

4|1前期準備

為了減少緩存的影響,在第一個終端中,運行下面的命令來清理文件頁、目錄項、Inodes 等各種緩存

<code>echo 3 > /proc/sys/vm/drop_caches/<code>

5|0場景一:磁盤和文件寫案例

5|1文件寫場景

第一個終端運行 vmstat

<code>vmstat 1 /<code>

結果分析

輸出界面裡, 內存部分的 buff 和 cache ,以及 io 部分的 bi 和 bo 就是要關注的重點buff 和 cache 就是我們前面看到的 Buffers 和 Cache,單位是 KBbi 和 bo 則分別表示塊設備讀取和寫入的大小,單位為塊 / 秒,因為 Linux 中塊的大小是 1KB,所以這個單位也就等價於 KB/s正常情況下,空閒系統中,你應該看到的是,這幾個值在多次結果中一直保持不變

第二個終端運行 dd

<code># 讀取隨機設備,生成一個 500MB 大小的文件 dd if=/dev/urandom of=/tmp/file bs=1M count=500/<code>

觀察第一個終端的 vmstat 運行情況

結果分析

從 dd 命令開始運行時,cache 不斷增加,而 buff 基本不變(看藍色向下箭頭)在 cache 剛開始增長時,塊設備 I/O 很少,bi、bo 都是 0KB,而在之後才出現大量的塊設備寫,bo 變成了 98384當 dd 命令結束後,cache 不再持續性增長,但塊設備寫還會持續一段時間,並且多次 I/O 寫的結果加起來(bo 藍色框),就是 dd 要寫的 500M 的數據

5|2磁盤寫場景

前提條件

需要你的系統配置多塊磁盤,並且磁盤分區 /dev/sdb1 還要處於未使用狀態如果你只有一塊磁盤,千萬不要嘗試,否則將會對你的磁盤分區造成損壞

第二個終端運行 dd

<code>echo 3 > /proc/sys/vm/drop_caches # 然後運行 dd 命令向磁盤分區 /dev/sdb1 寫入 2G 數據 dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048/<code>

第一個終端運行 vmstat,觀察內存和 I/O 的變化情況

結果分析

buff 和 cache 都在增長,但 buff 增長速度快很多說明寫磁盤用到了大量的 Buffer

總結

寫文件時會用到 Cache 緩存數據,而寫磁盤則會用到 Buffer 來緩存數據所以,雖然文檔上只提到,Cache 是文件讀的緩存,但實際上,
Cache 也會緩存寫文件時的數據

6|0場景二:磁盤和文件讀案例

6|1文件讀場景

第二個終端運行 dd 讀取文件

<code>echo 3 > /proc/sys/vm/drop_caches # 然後運行 dd 命令讀取文件數據 dd if=/dev/sda1 of=/dev/null bs=1M count=1024/<code>

第一個終端運行 vmstat 觀察內存和 I/O 變化情況

結果分析

讀取文件時(也就是 bi 大於 0 時),Buffer 保持不變,而 Cache 則在不停增長這跟查到的定義【Cache 是對文件讀的頁緩存】是一致的

6|2磁盤讀場景

第二個終端運行 dd 讀取磁盤

<code>echo 3 > /proc/sys/vm/drop_caches # 運行 dd 命令讀取文件 dd if=/dev/sda1 of=/dev/null bs=1M count=1024/<code>

第一個終端運行 vmstat 觀察內存和 I/O 變化情況

結果分析

讀磁盤時(也就是 bi 大於 0 時),Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快很多這說明讀磁盤時,數據緩存到了 Buffer 中

7|0總結 Buffer 和 Cache 的說明

Buffer 既可以用作將要寫入磁盤數據的緩存
,也可以用作從磁盤讀取數據的緩存Cache 既可以用作從文件讀取數據的頁緩存,也可以用作寫文件的頁緩存總結:Buffer 是對磁盤數據的緩存,而 Cache 是文件數據的緩存,它們既會用在讀請求中,也會用在寫請求

從讀寫角度總結 Buffer 和 Cache 緩存磁盤和文件系統的讀寫數據

的角度來說,不僅可以優化磁盤和文件的寫入,對應用程序也有好處,應用程序可以在數據真正落盤前,就返回去做其他工作從的角度來說,既可以加速讀取那些需要頻繁訪問的數據,也降低了頻繁 I/O 對磁盤的壓力