【Linux】vmstatによるバッファキャッシュ、ページキャッシュの使用量確認

2024年1月14日

本記事の検証環境

  • 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

参考情報

Linux

Posted by fanfanta