效能測試必備知識(11)- 怎麼理解記憶體中的Buffer和Cache?

小菠蘿測試筆記發表於2020-08-15

做效能測試的必備知識系列,可以看下面連結的文章哦

https://www.cnblogs.com/poloyy/category/1806772.html

 

快取

  • 從 free 命令可以看到,快取其實就是 Buffer 和 Cache 兩部分的總和
  • 字面意思,Buffer 是快取區,Cache 是快取,兩者都是資料再記憶體中的臨時儲存

 

Buffer 和 Cache 的區別

man free

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

  • Buffers:核心緩衝區用到的記憶體,對應的是 /proc/meminfo 中的 Buffers
  • Cache:核心頁快取和 Slab 用到的記憶體,對應的是 /proc/meminfo 中的 Cached SReclaimable 之和

 

注意事項

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

 

proc 檔案系統

再次回顧 proc

  •  /proc 是 Linux 核心提供的一種特殊檔案系統,是使用者跟核心互動的介面
  • 比方說,使用者可以從 /proc 中查詢核心的執行狀態和配置選項, 查詢程式的執行狀態、統計資料等,也可以通過 /proc 來修改核心的配置
  • proc 檔案系統同時也是很多效能工具的最終資料來源

 

瞭解 Buffer 和 Cache

檢視幫助文件,找到它們

man proc

 

Buffers

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

 

Cached

  • 從磁碟讀取檔案的頁快取,也就是用來快取從檔案讀取的資料
  • 這樣,下次訪問這些檔案資料時,就可以直接從記憶體中快速獲取,而不需要再次訪問緩慢的磁碟。

 

SReclaimable

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

 

靈魂拷問

  • Buffers 能不能快取磁碟中的資料?
  • Cached 能不能快取磁碟中的資料?

 

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

 

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

系統配置

  • 作業系統:Ubuntu 18.04
  • 機器配置:2 CPU,8GB 記憶體
  • 預先安裝 sysstat 包  apt install sysstat 
  • 開啟兩個終端連線到 Ubuntu 系統上

 

前期準備

為了減少快取的影響,在第一個終端中,執行下面的命令來清理檔案頁、目錄項、Inodes 等各種快取

echo 3 > /proc/sys/vm/drop_caches

 

場景一:磁碟和檔案寫案例

檔案寫場景

第一個終端執行 vmstat

vmstat 1 

結果分析

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

 

第二個終端執行 dd

# 讀取隨機裝置,生成一個 500MB 大小的檔案
dd if=/dev/urandom of=/tmp/file bs=1M count=500

 

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

結果分析

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

 

磁碟寫場景

前提條件

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

 

第二個終端執行 dd

echo 3 > /proc/sys/vm/drop_caches

# 然後執行 dd 命令向磁碟分割槽 /dev/sdb1 寫入 2G 資料
dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048

 

第一個終端執行 vmstat,觀察記憶體和 I/O 的變化情況

結果分析

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

 

總結

  • 寫檔案時會用到 Cache 快取資料,而寫磁碟則會用到 Buffer 來快取資料
  • 所以,雖然文件上只提到,Cache 是檔案讀的快取,但實際上,Cache 也會快取寫檔案時的資料

 

場景二:磁碟和檔案讀案例

檔案讀場景

第二個終端執行 dd 讀取檔案

echo 3 > /proc/sys/vm/drop_caches

# 然後執行 dd 命令讀取檔案資料
dd if=/dev/sda1 of=/dev/null bs=1M count=1024

 

第一個終端執行 vmstat 觀察記憶體和 I/O 變化情況

結果分析

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

 

磁碟讀場景

第二個終端執行 dd 讀取磁碟

echo 3 > /proc/sys/vm/drop_caches

# 執行 dd 命令讀取檔案
dd if=/dev/sda1 of=/dev/null bs=1M count=1024

 

第一個終端執行 vmstat 觀察記憶體和 I/O 變化情況

結果分析

  • 讀磁碟時(也就是 bi 大於 0 時),Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快很多
  • 這說明讀磁碟時,資料快取到了 Buffer 中

 

總結 Buffer 和 Cache 的說明

  • Buffer 既可以用作將要寫入磁碟資料的快取,也可以用作從磁碟讀取資料的快取
  • Cache 既可以用作從檔案讀取資料的頁快取,也可以用作寫檔案的頁快取
  • 總結:Buffer 是對磁碟資料的快取,而 Cache 是檔案資料的快取,它們既會用在讀請求中,也會用在寫請求

 

從讀寫角度總結 Buffer 和 Cache 快取磁碟和檔案系統的讀寫資料

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

 

相關文章