事始め
タイトルの通りです。 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の高速化を行うためのキャッシュとして利用されるメモリのこと。空きメモリは、使用中のメモリとキャッシュに使われなかったメモリ。
使用中のメモリが増えると、空きメモリが減る。
空きメモリがある限り、基本的にキャッシュはどんどん増加する。
空きメモリがなくなれば、使用中のメモリの増加に応じて、キャッシュが減る。
キャッシュに割り当てられるメモリがなくなると、I/Oのパフォーマンスは低下する
使用中のメモリが実メモリより多くくなりそうになると、あふれる部分をスワップへ書き出す。
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