【Linux】vmstatによるバッファキャッシュ、ページキャッシュの使用量確認
本記事の検証環境
- MacBook Pro 2023
- macOS Ventura 13.4 (ホストOS)
- Ubuntu 22.04.3 LTS (ゲストOS)
vmstatの基本的な使い方
更新間隔と更新回数を指定します。更新間隔のみ指定した場合、ctrl + Cで停止しない限り更新を続けます。
$ vmstat オプション 更新間隔 更新回数
# 1秒間隔で10回更新
$ vmstat 1 10
# 1秒間隔で無限に更新
$ vmstat 1
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 12697472 413604 2251576 0 0 370 472 89 83 2 3 95 0 0
0 0 0 12693742 413604 2251584 0 0 152 2082 3929 0 0 0 99 0 0
0 0 0 12695484 413612 2251576 0 0 248 3229 6269 3 1 96 0 0
0 0 0 12695484 413612 2251584 0 0 0 2267 4288 1 0 99 0 0
0 0 0 12693204 413612 2251584 0 0 76 2219 4224 2 0 98 0 0
0 0 0 12693124 413616 2251588 0 0 292 2900 5500 2 1 97 0 0
0 0 0 12691272 413616 2251588 0 0 0 2254 4269 0 1 00 0 0
0 0 0 12694328 413620 2251588 0 0 240 3537 6713 1 0 99 0 0
0 0 0 12694328 413620 2251588 0 0 32 2050 5919 1 0 99 0 0
1 0 0 12692908 413620 2251588 0 0 152 3168 5970 3 0 94 0 0
メモリに関する表示項目は以下です。
- swpd: スワップアウトされたメモリ量
- free: 空きメモリ量
- buff: バッファキャッシュのメモリ量
- cache: ページキャッシュのメモリ量
buffはファイルシステムを使用せずにストレージデバイスにアクセスする場合やファイルシステムのメタデータの格納に使用されます。
cacheはファイルシステムを使用してストレージデバイスにアクセスする場合に使用されます。
ページキャッシュの使用量確認
ファイルの作成、読み込みを行い、前後でページキャッシュの使用量の変化を確認します。
ファイル作成時のページキャッシュ使用量の変化
まずはページキャッシュ、バッファキャッシュ削除後にvmstatを実行します。
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ vmstat -Sm
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 15233 6 561 0 0 515 527 734 1351 2 1 97 0 0
ddコマンドで10GBのファイル作成後にvmstatを実行します。
$ dd if=/dev/zero of=big_file bs=1G count=10
10+0 records in
10+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 5.9422 s, 1.8 GB/s
$ vmstat -Sm
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 4163 17 11601 0 0 496 943 732 1349 2 1 97 0 0
ページキャッシュ(cache)の使用量が大きくなっていることが確認できました。
ファイル読み込み時のページキャッシュ使用量の変化
まずはページキャッシュ、バッファキャッシュ削除後にvmstatを実行します。
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ vmstat -Sm
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 15289 4 518 0 0 429 822 725 1339 2 1 97 0 0
先ほど作成した10GBのファイルをcatで読み込み後にvmstatを実行します。ページキャッシュ(cache)の使用量が大きくなっていることが確認できます。
また、ページキャッシュ作成後に再度catでの読み込みを行うと、ページキャッシュ(cache)が存在するため実行速度が速くなっていることも確認できます。
# ページキャッシュ作成前
$ time cat big_file > /dev/null
cat big_file > /dev/null 0.01s user 1.64s system 50% cpu 3.221 total
$ vmstat -Sm
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 4463 15 11324 0 0 783 801 725 1340 2 1 97 0 0
# ページキャッシュ作成後
$ time cat big_file > /dev/null
cat big_file > /dev/null 0.00s user 0.61s system 99% cpu 0.614 total
バッファキャッシュの使用量確認
ファイルシステムを通さないファイルの読み込み、大量のファイル作成を行い、前後でバッファキャッシュの使用量の変化を確認します。
デバイスファイルからのファイル読み込み時のバッファキャッシュ使用量の変化
まずはページキャッシュ、バッファキャッシュ削除後にvmstatを実行します。
$ vmstat -Sm
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 15256 3 533 0 0 399 469 262 435 2 2 96 0 0
ddコマンドにより/dev/vda2から1GB読み込みんだ後にvmstatを実行します。バッファキャッシュ(buff)の使用量が増加していることが確認できます。
バッファキャッシュ作成後に再びddコマンドで/dev/vda2から1GB読み込みます。バッファキャッシュにより実行時間が約0.19秒→0.06秒と速くなっています。
#バッファキャッシュ作成前
$ sudo time dd if=/dev/vda2 of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.187352 s, 5.7 GB/s
0.00user 0.15system 0:00.18elapsed 84%CPU (0avgtext+0avgdata 2960maxresident)k
0inputs+0outputs (3major+344minor)pagefaults 0swaps
$ vmstat -Sm
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 14128 1089 579 0 0 415 460 271 455 2 2 96 0 0
#バッファキャッシュ作成後
$ sudo time dd if=/dev/vda2 of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.0628201 s, 17.1 GB/s
0.00user 0.06system 0:00.06elapsed 100%CPU (0avgtext+0avgdata 2960maxresident)k
0inputs+0outputs (0major+345minor)pagefaults 0swaps
大量のファイル作成と検索時のバッファキャッシュ使用量の変化
まずはページキャッシュ、バッファキャッシュ削除後にvmstatを実行します。
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ vmstat -Sm
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 15279 2 521 0 0 663 687 731 105 2 1 97 0 0
1,000,000個のファイルを作成し、lsによるファイル一覧表示とfindによる検索を行った後にvmstatを実行します。バッファキャッシュ(buff)の使用量が増加ししていますが、ファイル読み込み時より増加量は少ないです。
この操作ではページキャッシュの使用量の増加の方が大きかったです。
$ for i in {1..1000000}; do dd if=/dev/zero of=file$i bs=1M count=1; done
$ ll > /dev/null
$ find . -type f > /dev/null
$ vmstat -Sm
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 13004 420 2308 0 0 835 489 65 35 2 3 95 0 0