カーネル内部のキャッシュを開放するには
$ 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:空きメモリを増やしても,多くの場合メリットは有りません.強いて言えば断片化を解消するぐらいかな?