天天看點

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

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

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

從 free 指令可以看到,緩存其實就是 Buffer 和 Cache 兩部分的總和

字面意思,Buffer 是緩存區,Cache 是緩存,兩者都是資料在記憶體中的臨時存儲

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

Buffers:核心緩沖區用到的記憶體,對應的是 /proc/meminfo 中的 Buffers 值

Cache:核心頁緩存和 Slab 用到的記憶體,對應的是 /proc/meminfo 中的 Cached 與 SReclaimable 之和

同一個名額的具體含義,就可能因為核心版本、性能工具版本的不同而有挺大差别

是以百度 Buffer 和 Cache 什麼意思可能并不适用于你目前的環境

是以可以通過下面說的 proc 檔案系統來确認它們的含義

 /proc 是 Linux 核心提供的一種特殊檔案系統,是使用者跟核心互動的接口

比方說,使用者可以從 /proc 中查詢核心的運作狀态和配置選項, 查詢程序的運作狀态、統計資料等,也可以通過 /proc 來修改核心的配置

proc 檔案系統同時也是很多性能工具的最終資料來源

檢視幫助文檔,找到它們

對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的資料,通常不會特别大 (20MB 左右)

核心就可以把分散的寫集中起來,統一優化磁盤的寫入,比如,可以把多次小的寫合并成單次大的寫等等

從磁盤讀取檔案的頁緩存,也就是用來緩存從檔案讀取的資料

這樣,下次通路這些檔案資料時,就可以直接從記憶體中快速擷取,而不需要再次通路緩慢的磁盤。

是 Slab 的一部分

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

Buffers 能不能緩存磁盤中讀的資料?

Cached 能不能緩存磁盤中寫的資料?

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

作業系統:Ubuntu 18.04

機器配置:2 CPU,8GB 記憶體

預先安裝 sysstat 包  apt install sysstat 

打開兩個終端連接配接到 Ubuntu 系統上

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

輸出界面裡, 記憶體部分的 buff 和 cache ,以及 io 部分的 bi 和 bo 就是要關注的重點

buff 和 cache 就是我們前面看到的 Buffers 和 Cache,機關是 KB

bi 和 bo 則分别表示塊裝置讀取和寫入的大小,機關為塊 / 秒,因為 Linux 中塊的大小是 1KB,是以這個機關也就等價于 KB/s

正常情況下,空閑系統中,你應該看到的是,這幾個值在多次結果中一直保持不變

從 dd 指令開始運作時,cache 不斷增加,而 buff 基本不變(看藍色向下箭頭)

在 cache 剛開始增長時,塊裝置 I/O 很少,bi、bo 都是 0KB,而在之後才出現大量的塊裝置寫,bo 變成了 98384

當 dd 指令結束後,cache 不再持續性增長,但塊裝置寫還會持續一段時間,并且多次 I/O 寫的結果加起來(bo 藍色框),就是 dd 要寫的 500M 的資料

需要你的系統配置多塊磁盤,并且磁盤分區 /dev/sdb1 還要處于未使用狀态

如果你隻有一塊磁盤,千萬不要嘗試,否則将會對你的磁盤分區造成損壞

buff 和 cache 都在增長,但 buff 增長速度快很多

說明寫磁盤用到了大量的 Buffer

寫檔案時會用到 Cache 緩存資料,而寫磁盤則會用到 Buffer 來緩存資料

是以,雖然文檔上隻提到,Cache 是檔案讀的緩存,但實際上,Cache 也會緩存寫檔案時的資料

讀取檔案時(也就是 bi 大于 0 時),Buffer 保持不變,而 Cache 則在不停增長

這跟查到的定義【Cache 是對檔案讀的頁緩存】是一緻的

讀磁盤時(也就是 bi 大于 0 時),Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快很多

這說明讀磁盤時,資料緩存到了 Buffer 中

Buffer 既可以用作将要寫入磁盤資料的緩存,也可以用作從磁盤讀取資料的緩存

Cache 既可以用作從檔案讀取資料的頁緩存,也可以用作寫檔案的頁緩存

總結:Buffer 是對磁盤資料的緩存,而 Cache 是檔案資料的緩存,它們既會用在讀請求中,也會用在寫請求

從寫的角度來說,不僅可以優化磁盤和檔案的寫入,對應用程式也有好處,應用程式可以在資料真正落盤前,就傳回去做其他工作

從讀的角度來說,既可以加速讀取那些需要頻繁通路的資料,也降低了頻繁 I/O 對磁盤的壓力