Linuxサーバでディスクキャッシュを説明する

なぜメモリ使用量などを意識する必要があるのかについて説明するとした場合の簡単な案です。ディスクへのアクセスという観点でメモリがどのように利用されているかを考えて見る内容で説明してみます。Software Design 2018年1月号|技術評論社を参考にさせていただきました。

最近は自分で手を動かしながら、実際の挙動を見ることができるような書籍・記事が増えてきたので、実際にやってみることができて嬉しいです。

一般的なOSでは、物理的なディスクにアクセスする際、以下のようなフローでアクセスする:

  1. メモリ上にファイルが読み込まれている場合、メモリからファイルを読み込む
  2. メモリ上に存在しない場合、直接ディスクにアクセスする

当然ながら、ディスクへのアクセス速度 <<<<< メモリへのアクセス速度のため、基本的な戦略としては「メモリにファイルを読み込ませる」こととなる。

ここではディスクキャッシュの有り無しでどのようにディスクへのアクセス速度が変化するかを見てみます。

まずはLinux上でのメモリ管理について簡単におさらいします。

freeコマンドを実行することで、メモリ上にキャッシュされているファイルサイズを確認できます。freeコマンドを実行した際の、buff/cache列を参照します:

1
2
3
4
kazu634@bastion% free -m
                total        used        free      shared  buff/cache   availableMem:
                488         130          27           5         330         324
Swap:          1023          58         965

/proc/sys/vim/drop_caches3を書き込むことで、メモリ上に格納されているキャッシュをドロップできます:

1
2
3
4
5
6
7
8
kazu634@bastion% echo 3 | sudo tee /proc/sys/vm/drop_caches
[sudo] kazu634 のパスワード:
3
kazu634@bastion% free -m
              total        used        free      shared  buff/cache   available
Mem:            488         131         275           5          81         322
Swap:          1023          58         965
kazu634@bastion%

すでに説明してきたように、OSがファイルにアクセスする際は、メモリ上のキャッシュ経由のアクセスと、直接ディスクにアクセスする場合の2つのパターンがあります。

いずれの場合もhdparamコマンドを利用することで計測できます。

hdparamコマンドに-Tオプションを指定することで、メモリ上のキャッシュを経由した場合のアクセス速度を計測できます。実行例は以下になります:

1
2
3
kazu634@bastion% sudo hdparm -T /dev/sda1
/dev/sda1:
 Timing cached reads:   11364 MB in  2.00 seconds = 5684.50 MB/sec

hdparamコマンドに-tオプションを指定することで、直接ディスクにアクセスする場合のアクセス速度を計測できます。実行例は以下になります:

1
2
3
kazu634@bastion% sudo hdparm -t /dev/sda1
/dev/sda1:
 Timing buffered disk reads: 124 MB in  3.07 seconds =  40.43 MB/sec

まずはキャッシュをドロップします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kazu634@bastion% free -m
              total        used        free      shared  buff/cache   availableMem:
               488         130          27           5         330         324
Swap:          1023          58         965
kazu634@bastion%
kazu634@bastion% echo 3 | sudo tee /proc/sys/vm/drop_caches
[sudo] kazu634 のパスワード:
3
kazu634@bastion% free -m
              total        used        free      shared  buff/cache   available
Mem:            488         131         275           5          81         322
Swap:          1023          58         965
kazu634@bastion%

直接ディスクにアクセスした場合はこのような結果でした:

1
2
3
kazu634@bastion% sudo hdparm -t /dev/sda1
/dev/sda1:
 Timing buffered disk reads: 124 MB in  3.07 seconds =  40.43 MB/sec

ディスクキャッシュ経由でアクセスした場合は、このような結果でした:

1
2
3
kazu634@bastion% sudo hdparm -T /dev/sda1
/dev/sda1:
 Timing cached reads:   11364 MB in  2.00 seconds = 5684.50 MB/sec

ディスクキャッシュを経由したほうが、すごく早いです!少なくとも読み込みは!