Linuxのページキャッシュをきれいさっぱり消すには?

oktcache, drop_caches, kernel, linux, キャッシュ, 解放

oktです。
インフラ系とか社内システムとかいろいろ担当してます。

Linuxのカーネルは過去に読み込んだディスクの内容をメインメモリに保持する機能を持ってます。

重要な機能ですが、普段サーバ等を触っている分には意識しないことが多くハマったりします。
意識しないでプログラムの検証なんかしていると、キャッシュ有無で大きく結果が違ったりします。
ちなみにページキャッシュ自体についてはhatenaのnaoyaさんの記事を読むのをお勧めします。

そんなわけで、意図的にキャッシュを消したい場合には?という方のためにメモを残してみます。

linux kernel 2.6.16以降、以下の操作でページキャッシュを強制的にクリアすることができます。
ちなみに、RHEL4は2.6.9ベースのカーネルですが、RHEL4.6から実装されています。

# echo 1 > /proc/sys/vm/drop_caches

man proc 抜粋

/proc/sys/vm/drop_caches (Linux 2.6.16 以降)
このファイルに書き込みを行うことで、クリーンなキャッシュ、dentry、 inode をメモリ上から外し、そのメモリを解放する。

ページキャッシュを解放するには、 echo 1 > /proc/sys/vm/drop_caches とする。
dentry、inode を解放するには、 echo 2 > /proc/sys/vm/drop_caches とする。
ページキャッシュ、dentry、inode を解放するには、 echo 3 > /proc/sys/vm/drop_caches とする。
この操作は非破壊的な操作で、ダーティな (dirty) オブジェクトは解放されないので、この操作を行う際は最初に sync(8) を実行しておくべきである。

実行した場合にはこんな感じになります。

[root@host1 ~]# free -m
total used free shared buffers cached
Mem: 512 239 272 0 0 111
-/+ buffers/cache: 127 384
Swap: 1055 0 1055
[root@host1 ~]# echo 1 > /proc/sys/vm/drop_caches
[root@host1 ~]# free -m
total used free shared buffers cached
Mem: 512 147 364 0 0 19
-/+ buffers/cache: 127 384
Swap: 1055 0 1055
[root@host1 ~]# uname -a
Linux host1.example.org 2.6.9-78.0.5.ELxenU #1 SMP Wed Oct 8 07:38:51 EDT 2008 i686 i686 i386 GNU/Linux

という具合です。

oktcache, drop_caches, kernel, linux, キャッシュ, 解放

Posted by okt