kernelの cache を強制開放する方法

カーネル内部のキャッシュを開放するには

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

とします.

これにより

ことが期待できます.

ベンチマークの場合で説明すると,たとえば find コマンドの処理時間を2回連続して計測すると

$ time find /usr > /dev/null

real	0m3.818s
user	0m0.040s
sys	0m0.207s

$ time find /usr > /dev/null

real	0m0.030s
user	0m0.003s
sys	0m0.023s

2回目のfindコマンドは一瞬で処理が完了します.これは各ファイルの情報(具体的には inode と dentry)がメモリ上にキャッシュされるためです.上記の例だと,1回目と2回目とでは100倍も処理時間が違います.

通常はこのキャッシュのお陰でシステムが軽快に動作します.しかしベンチマークを取る場合やデータベースとかサーバのチューニングをする場合は非常に都合が悪いです.そこで次のように毎回キャッシュをクリアしながらベンチマークを取ります.

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

$ time find /usr > /dev/null

real	0m3.876s
user	0m0.047s
sys	0m0.203s

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

$ time find /usr > /dev/null

real	0m3.810s
user	0m0.050s
sys	0m0.197s

これで1回目も2回目も大体同じような処理時間になります.


/proc/sys/vm/drop_caches の詳細は proc(5) のマニュアルに書いて有ります.

$ man proc

概要としては

echo 1 > /proc/sys/vm/drop_caches
ページキャッシュ(≒ファイルの中身のキャッシュ)をクリア
echo 2 > /proc/sys/vm/drop_caches
dentryとinodeのキャッシュ(≒ファイルの管理情報のキャッシュ)を開放
echo 3 > /proc/sys/vm/drop_caches
両方を開放.

という仕様のようです.

*1:空きメモリを増やしても,多くの場合メリットは有りません.強いて言えば断片化を解消するぐらいかな?