Top > Linux > Linux OS でキャッシュをクリアする
Linux OS でキャッシュをクリアする方法 (Kernel 2.6.16〜)
性能の試験をするときにファイルシステムのキャッシュによる影響を排除する。
root もしくはスーパーユーザーコマンドにて行なう。
% su root or sudo
# sync
# sysctl -w vm.drop_caches=1
# sysctl -w vm.drop_caches=2
# sysctl -w vm.drop_caches=3
or
# echo 1 > /proc/sys/vm/drop_caches
# echo 2 > /proc/sys/vm/drop_caches
# echo 3 > /proc/sys/vm/drop_caches
1 … ページキャッシュのクリア
2 … ディレクトリエントリー(dentry)と inode のクリア
3 … ページキャッシュおよびディレクトリエントリー(dentry) とinode のクリア
このコマンドはアプリケーションに対して破壊的なコマンド(※1) ではない。
(注意) どのコマンドでもダーティ・オブジェクト(※2) のクリアは行わない。
ダーティ・オブジェクトをクリアするためには sync コマンドを事前に実行しておく。
(※1) 比較対象として Oracle の SQL 文 ALTER SYSTEM FLUSH BUFFER_CACHE は実行中の SQL の結果セットが正しく戻らなくなるアプリケーションに対して破壊的なコマンドである。
(※2) ファイルの内容を変更したマークが付けられているが保存用メディア(HDDなど) に書き込みはされていない状態を「ダーティ(汚れている)」という。
キャッシュ・クリアの実行例
ディレクトリ・エントリー (dentry;d entry) と inode (i node) のクリア (メモリ 2GB の VM 環境)
# free
total used free shared buffers cached
Mem: 2054808 981488 1073320 0 178616 511568
-/+ buffers/cache: 291304 1763504
Swap: 2096472 0 2096472
# cat /proc/slabinfo | grep --regexp='^inode_cache\|dentry'
inode_cache 5657 5688 592 6 1 : tunables 54 27 8 : slabdata 948 948 0
dentry 67587 67720 192 20 1 : tunables 120 60 8 : slabdata 3386 3386 0
# sync
# sysctl -w vm.drop_caches=2
vm.drop_caches = 2
# # grep は cat & パイプを使わなくても良い (UUOC と呼ばれる Useless Use Of Cat)
# grep --regexp='^inode_cache\|dentry' /proc/slabinfo
inode_cache 4171 4314 592 6 1 : tunables 54 27 8 : slabdata 716 719 172
dentry 15860 20940 192 20 1 : tunables 120 60 8 : slabdata 1047 1047 384
# free
total used free shared buffers cached
Mem: 2054808 537684 1517124 0 178616 121100
-/+ buffers/cache: 237968 1816840
Swap: 2096472 0 2096472
続いて ページキャッシュも含めたキャシュのクリア
# sync
# sysctl -w vm.drop_caches=3
vm.drop_caches = 3
# free
total used free shared buffers cached
Mem: 2054808 314732 1740076 0 844 85080
-/+ buffers/cache: 228808 1826000
Swap: 2096472 0 2096472
vm.drop_caches のデフォルト値は 0 でカーネルが管理している状態であるが実行後に値を 0 に戻す必要はない。
ダーティ・オブジェクト
ダーティ・オブジェクトは /proc/meminfo から参照できる。
# grep 'Dirty' /proc/meminfo
Dirty: 28 kB
# sync
# grep 'Dirty' /proc/meminfo
Dirty: 0 kB
豆知識 kB と kb (Bの大文字と小文字)
kB = キロバイト
kb = キロビット
誤解を防ぐためにビットを表記する場合には kbit をおすすめする。
ファイルシステム関連 スラブ・アロケーター
CentOS 6 (kernel 2.6.32-220.17.1.el6.x86_64)
個別アロケーターの詳細までは調べてませんので誤りがあるかもしれません。
bdev_cache
cdev_cache
sysfs_dir_cache
mnt_cache
filp
inode_cache
dentry
names_cache
avc_node
selinux_inode_security
radix_tree_node
key_jar
buffer_head
vm_area_struct
mm_struct
fs_cache
files_cache