事始め

タイトルの通りです。 OSはね、頻繁にアクセスされるファイルをメモリ上に載せておくんですね。ディスクアクセスは基本的に遅くなってしまうからね。その辺をいい感じにまとめておきたいのよね。

参考文献

[この方の記事] (https://qiita.com/ryuichi1208/items/bbf221ab66562e1426ca)

[Linuxとメモリの基礎&vmstatの詳しい使い方] (https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d)

カーネルは、ディスク上のデータへのアクセスを高速に行うため、 read/writeの際にメモリ上にデータをキャッシュします。
キャッシュするメモリ上の領域を「ディスクキャッシュ」と 呼びます。

ディスクキャッシュには種類が2種類があります。それが「バッファキャッシュ」と「ページキャッシュ」です。
それぞれの概要は下記へ記します。
ちなみに、空きメモリがある限り、基本的にキャッシュはどんどん増加します。


ページというのは Linux の仮想メモリの最小単位。
ページキャッシュは、ディスク上のデータをページ単位で一時的に 保存するために使用されるメモリでファイルの読み書きの高速化に 使用されます。

バッファキャッシュは、プロセスがディスク上のデータに アクセスする際、アクセスすべきデータのブロックを高速に見つけるために使用されるメモリ

メモリの状態を確認する方法

メモリの使用状況はfrreeコマンド、もしくはvmstatコマンドで確認することができる。 それを使う前に まず、基礎として覚えておきたいのが、osのメモリ構造だよね。 実メモリがあって、メモリには3つの領域がある。 1つ目が、使用中のメモリ。 2つめが、キャッシュ。 3つ目が、空きメモリ。」

さらに、HDD等に、スワップ領域があるんだよね。

使用中のメモリは、カーネルとアプリケーションなどのプロセスによって使用されているメモリのこと。 キャッシュとは、HDDやSSDアクセスなど、I/Oの高速化を行うためのキャッシュとして利用されるメモリのこと。空きメモリは、使用中のメモリとキャッシュに使われなかったメモリ。

  1. 使用中のメモリが増えると、空きメモリが減る。

  2. 空きメモリがある限り、基本的にキャッシュはどんどん増加する。

  3. 空きメモリがなくなれば、使用中のメモリの増加に応じて、キャッシュが減る。

  4. キャッシュに割り当てられるメモリがなくなると、I/Oのパフォーマンスは低下する

  5. 使用中のメモリが実メモリより多くくなりそうになると、あふれる部分をスワップへ書き出す。

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   1560 157622480 336252 333521088    0    0     0     3    0    0  9  0 91  0  0

freeの結果

               total        used        free      shared  buff/cache   available
Mem:       494649720     3144036   157647192       53880   333858492   488291996
Swap:        4194300        1560     4192740

freeの方がわかりやすいよね。だから、freeを使うことにしよう。 total:合計メモリ量 used:メモリ使用量 free:全く使われていない未割当のメモリ量 shared:共有メモリで使用しているメモリ量 buff/cacheファイルバッファ+キャッシュメモリに使われているメモリ量 available:プロセスが利用できるメモリ量

g byte単位で出力

Singularity> free -g
               total        used        free      shared  buff/cache   available
Mem:             471           2         150           0         318         465
Swap:              3           0           3

これ見ると、buff/cacheがめっちゃ大きいことがわかるよねー

buff/cacheのクリア方法

以下のコマンドでbuff/cacheをクリアすることが可能ですね。ただし、root権限が必要となります。

echo 3 > /proc/sys/vm/drop_caches

ちなみに、どれを書き込みむかで、何をクリアするかが決まるそうです。

echo 1 would clear only the page cache.
echo 2 would clear only the dentries and inodes.
echo 3 (as shown) clears all of them, which is the most common choice

ということで、3を書き込んでみて、freeをもう一度見てみましょう。もう一度言いますが、rootが必要です。

[root@muffin2 hoehoge]# echo 3 > /proc/sys/vm/drop_caches
[root@muffin2 hoehoge]# free
              total        used        free      shared  buff/cache   available
Mem:      494649720     1795664   492571180       53884      282876   490699536
Swap:       4194300        1560     4192740

減ってはいますが、まだbuff/cacheは入ってますね。GBで見てみます。

[root@muffin2 hoehoge]# free -g
              total        used        free      shared  buff/cache   available
Mem:            471           1         469           0           0         467
Swap:             3           0           3

おー、ちゃんと0になっているね。 しかし、プログラムから一回一回echo 3するのは無理ですよね。

ということで、

ディスクキャッシュをOFFにする方法

これが大事なんです。どうやってやるんですか!って話でね。 chatGPTに聞いてみると、特定のブロックデバイスの読み込みを キャッシュを経由せずに直接ダイレクトI/Oする方法があるみたいですね。 どうやるか?chatGPT曰く、

sudo mount -o remount,directio /dev/sda1

でマウントするといいみたいですね。 directioっていうのは何かって話だけど、 次のように説明されています。

ダイレクトI/Oは,ハード・ディスク装置(以下,ディスク)上のデータにアクセスする機構の一つです。データベース管理システム向けとして,カーネル2.4で導入されました。

通常,ディスク上のファイルにアクセスする場合,ファイル・キャッシュを経由します。このファイル・キャッシュのおかげで,キャッシュにヒットした際にはデータ読み取り速度が高速化します。また,ファイル・キャッシュを利用した遅延書き込み機能により,プロセスに対する書き込み処理性能が向上します。ディスクに書き込まれたファイルはファイル・システムにより管理されます。

 ダイレクトI/Oを用いると,ディスク上のファイル(データ)にアクセスする際,ファイル・キャッシュを経由しません。データはアプリケーションなどのプロセスとディスク間で直接やり取りされます。

ファイル・キャッシュを経由しない同様の機構に「RAW I/O」があります。RAW I/Oは,ディスク全体をファイルとみなしてアクセスします。そのため,データの管理をファイル・システムで行うことができません。一方,ダイレクトI/Oはデータをファイルとして扱え,ファイル・システムによる管理が可能です

ってことで、ダイレクトI/Oのセットの仕方だけど、どうやるんだ?

いい感じの記事!

Hey all,

I'd like to disable the buffer/read cache when Linux reads from a file and stores it in temporary RAM, so if read again, it can be from RAM instead of disk. But I want to do it on just one storage device (say /dev/sdb).

I'm NOT looking to benchmark the specific storage device. What I'm looking for is to disable read buffering for it, because it is a SSD and I prefer my RAM to be used by cache from the slower hard disk instead of caching SSD.

Linux is not booted from the SSD anyway, since logging would kill it too fast for my use and I need all of its small space for the specialized applications I'm using (where I read from it 99% of the time and barely write).


Anyway my simple question is, can I tell linux to not cache the SSD, or at least prioritize one device for caching over another? If I run out of memory for caching, I'd like it to not discard my hard-disk's cached data, because re-reading data from SSD is much much faster than from HDD so I'd rather have it re-read from the SSD always.

これに対する返答が、

You can mount the filesystem with the "sync" option. Note this from the mount man page

でも、本当か?

これもなかなかいい感じのブログ

これ

キャッシュのクリア方法

echo 1 > /proc/sys/vm/drop_caches

The middlewareを動かしているときのFile cacheについて

いやー、結局、ファイルキャッシュがOnになっているんだよね。 見てくれ

[hoehoge@muffin2 ~]$ free
              total        used        free      shared  buff/cache   available
Mem:      494649720     1776504   492454860       53880      418356   490650712
Swap:       4194300        1560     4192740
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           1         469           0           0         467
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           1         469           0           0         467
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           1         469           0           0         467
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           4         465           0           1         465
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           5         464           0           2         464
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           5         463           0           2         463    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           6         462           0           2         462    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           6         461           0           3         462    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           7         460           0           3         461    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           7         460           0           3         461    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           8         459           0           3         461    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           8         459           0           3         460    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           8         458           0           4         460    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           9         458           0           4         459    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           9         457           0           4         459    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471           9         457           0           4         459    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          10         456           0           4         459    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          10         456           0           4         458    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          10         455           0           5         458    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          11         455           0           5         457    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          11         454           0           5         457    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          11         454           0           5         457    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          12         453           0           5         456    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          12         452           0           6         456    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          13         451           0           6         455    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          13         451           0           6         455    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          14         450           0           6         454    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          14         450           0           6         454    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          14         449           0           7         454    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          15         448           0           7         453    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          16         446           0           8         452    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          17         446           0           8         451    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          17         445           0           8         451    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          18         445           0           8         451    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          18         444           0           8         450    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          18         443           0           8         450    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          19         443           0           9         450    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          19         443           0           9         449    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          19         442           0           9         449    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          20         441           0           9         448    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          20         440           0          10         448    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          21         439           0          10         447    
Swap:             3           0           3
[hoehoge@muffin2 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            471          21         439           0          10         447    
Swap:             3           0           3