LInux性能優化--內存(buffer 和 cache的區別)

當使用free工具輸出的時候:
在這裏插入圖片描述
大部分指標都比較容易理解,但 Buffer 和 Cache 可能不太好區分。從字面上來說,Buffer 是緩衝區,而 Cache 是緩存,兩者都是數據在內存中的臨時存儲。
不知道的情況,就查文檔手冊

buffers
Memory used by kernel buffers (Buffers in /proc/meminfo)

   cache  Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)

   buff/cache
          Sum of buffers and cache

Buffers 是內核緩衝區用到的內存,對應的是 /proc/meminfo 中的 Buffers 值。
Cache 是內核頁緩存和 Slab 用到的內存,對應的是 /proc/meminfo 中的 Cached 與 SReclaimable 之和。
但是還是不清不楚的感覺,沒有更具體的解釋。
現在要怎麼辦呢?
因爲系統性能數據的來源,都是來自/proc文件系統,那麼通過查看/proc的手冊,有沒有更詳細的信息呢?

Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn’t get tremendously large (20MB or so).

Cached %lu
In-memory cache for files read from the disk (the page cache). Doesn’t include SwapCached.

SReclaimable %lu (since Linux 2.6.19)
Part of Slab, that might be reclaimed, such as caches.

SUnreclaim %lu (since Linux 2.6.19)
Part of Slab, that cannot be reclaimed on memory pressure.
1 Buffers 是對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,通常不會特別大(20MB 左右)。這樣,內核就可以把分散的寫集中起來,統一優化磁盤的寫入,比如可以把多次小的寫合併成單次大的寫等等。
2 Cached 是從磁盤讀取文件的頁緩存,也就是用來緩存從文件讀取的數據。這樣,下次訪問這些文件數據時,就可以直接從內存中快速獲取,而不需要再次訪問緩慢的磁盤。
3 SReclaimable 是 Slab 的一部分。Slab 包括兩部分,其中的可回收部分,用 SReclaimable 記錄;而不可回收部分,用 SUnreclaim 記錄。
看起來是解決問題了,但是還有幾個問題:
第一個問題,Buffer 的文檔沒有提到這是磁盤讀數據還是寫數據的緩存,而在很多網絡搜索的結果中都會提到 Buffer 只是對將要寫入磁盤數據的緩存。那反過來說,它會不會也緩存從磁盤中讀取的數據呢?
第二個問題,文檔中提到,Cache 是對從文件讀取數據的緩存,那麼它是不是也會緩存寫文件的數據呢?
通過作實驗來驗證一下
環境:
1 操作系統 ubuntu 18.04
2 內存 4G
3 CPU 2核
4 sudo apt install sysstat
5 爲了減少緩存的影響,記得在第一個終端中,運行下面的命令來清理系統緩存:
#清理文件頁、目錄項、Inodes等各種緩存
$ echo 3 > /proc/sys/vm/drop_caches
場景 1:磁盤和文件寫案例
vmstat 1
在這裏插入圖片描述
buff 和 cache 就是我們前面看到的 Buffers 和 Cache,單位是 KB。
bi 和 bo 則分別表示塊設備讀取和寫入的大小,單位爲塊 / 秒。因爲 Linux 中塊的大小是 1KB,所以這個單位也就等價於 KB/s。
這幾個值在多次結果中一直保持不變。
到第二個終端執行 dd 命令,通過讀取隨機設備,生成一個 500MB 大小的文件:
$ dd if=/dev/urandom of=/tmp/file bs=1M count=500
在這裏插入圖片描述
發現,在 dd 命令運行時, Cache 在不停地增長,而 Buffer 基本保持不變。
在 Cache 剛開始增長時,塊設備 I/O 很少,bi 只出現了一次 140 KB/s。而過一段時間後,纔會出現大量的塊設備寫,比如 bo 變成了 10884。多次 I/O 寫的結果加起來,纔是 dd 要寫的 500M 的數據。
把這個結果,跟我們剛剛瞭解到的 Cache 的定義做個對比,爲什麼前面文檔上說 Cache 是文件讀的頁緩存,怎麼現在寫文件也有它的份?
先放下疑問,在進行下個實驗
下面的命令對環境要求比較高,需要你的系統配置多塊磁盤,並且磁盤分區 /dev/sda 還要處於未使用狀態。如果你只有一塊磁盤,千萬不要嘗試,否則將會對你的磁盤分區造成損壞。
#首先清理緩存
$ echo 3 > /proc/sys/vm/drop_caches
#然後運行dd命令向磁盤分區/dev/sdb1寫入2G數據
$ dd if=/dev/urandom of=/dev/sda bs=1M count=2048
在這裏插入圖片描述
雖然同是寫數據,寫磁盤跟寫文件的現象還是不同的。寫磁盤時(也就是 bo 大於 0 時),Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快得多。
對比我們發現,寫文件時會用到 Cache 緩存數據,而寫磁盤則會用到 Buffer 來緩存數據。所以,回到剛剛的問題,雖然文檔上只提到,Cache 是文件讀的緩存,但實際上,Cache 也會緩存寫文件時的數據。
場景 2:磁盤和文件讀案例
#首先清理緩存
$ echo 3 > /proc/sys/vm/drop_caches
#運行dd命令讀取文件數據
$ dd if=/tmp/file of=/dev/null
在這裏插入圖片描述
結論: Buffer 保持不變,而 Cache 則在不停增長
#首先清理緩存
$ echo 3 > /proc/sys/vm/drop_caches
#運行dd命令讀取文件
$ dd if=/dev/sda1 of=/dev/null bs=1M count=1024
在這裏插入圖片描述
結論:Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快很多。這說明讀磁盤時,數據緩存到了 Buffer 中
通過實驗得出的結論:
1 Buffer 既可以用作“將要寫入磁盤數據的緩存”,也可以用作“從磁盤讀取數據的緩存”。
2 Cache 既可以用作“從文件讀取數據的頁緩存”,也可以用作“寫文件的頁緩存”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章