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


Linux OS でキャッシュをクリアするの関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー