vmstat コマンドの buff と cache の違い

#  buff と cache の違い

> **ページキャッシュとバッファキャッシュ**
ほとんどのファイルシステムでは、ディスクから読み込んだデータをキャッシュする。データへの `アクセス方式によって` 、ページキャッシュとバッファキャッシュに分けられる。
> https://www.kimullaa.com/entry/2019/12/01/130347

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/0cde84b2-a1e2-c161-7676-d94ee896a307.png)

x 「何のデータか」
o 「どうやって取得したか」

## cacheを増やす方法
> **ページキャッシュ**
`ファイルシステム経由` でアクセスしたデータのキャッシュ。

file system(HDD/SSD)からファイルを読む

```ruby
# でかいファイルを作る
 dd if=/dev/zero of=/tmp/large.txt count=100 bs=10M

# cache削除
 echo 3 > /proc/sys/vm/drop_caches

# cacheが減った状態
 vmstat

# １回目
time cat /tmp/large.txt > /dev/null

# cacheが載った状態
 vmstat

```

この記事参照
https://qiita.com/uturned0/items/3eab2a8d03180677f768


### cache result
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/19e70856-1a62-393f-3b92-6cd2860ef168.png)


```ruby
[root@localhost test]# # でかいファイルを作る
[root@localhost test]#  dd if=/dev/zero of=/tmp/large.txt count=100 bs=10M

100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 1.24035 s, 845 MB/s
[root@localhost test]#
[root@localhost test]# # cache削除
[root@localhost test]#  echo 3 > /proc/sys/vm/drop_caches
[root@localhost test]#
[root@localhost test]# # cacheが減った状態
[root@localhost test]#  vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1550208      0 221652    0    0  2181  2180  144  159  2  2 96  0  0
[root@localhost test]#
[root@localhost test]# # １回目
[root@localhost test]# time cat /tmp/large.txt > /dev/null

real	0m1.950s
user	0m0.012s
sys	0m1.639s
[root@localhost test]#
[root@localhost test]# # cacheが載った状態
[root@localhost test]#  vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 688060      0 1083692    0    0  2471  2179  147  161  2  2 96  0  0
[root@localhost test]#
[root@localhost test]#
```

## buffを増やす方法
> **バッファキャッシュ**
`raw I/O 経由` でアクセスしたデータをキャッシュする。実装上は、ブロックデバイスに対するページキャッシュになっている。

ファイルではなく、block device `/dev/sd*` を直接読み込む。

```
# buff削除
 echo 3 > /proc/sys/vm/drop_caches

# buffが減った状態
 vmstat

# buff を載せる
time dd if=/dev/sda of=/dev/null count=100 bs=10M

# buffが載った状態
 vmstat
```

### buff result

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/7a5f1b08-4396-b2bc-82e0-e0bebf610d7b.png)

```ruby

[root@localhost test]# # buff削除
[root@localhost test]#  echo 3 > /proc/sys/vm/drop_caches
[root@localhost test]#
[root@localhost test]# # buffが減った状態
[root@localhost test]#  vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1718432      0  53296    0    0  2430  2176  146  159  2  2 96  0  0
[root@localhost test]#
[root@localhost test]# # buff を載せる
[root@localhost test]# time dd if=/dev/sda of=/dev/null count=100 bs=10M

100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 1.51047 s, 694 MB/s

real	0m1.515s
user	0m0.001s
sys	0m1.122s
[root@localhost test]#
[root@localhost test]# # buffが載った状態
[root@localhost test]#  vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 690092 1028096  53344    0    0  2771  2175  149  163  2  2 96  0  0
[root@localhost test]#
```