ページキャッシュの手動解放

カーネルパラメータvm.drop_caches*1を変更すると、ページキャッシュ・ダーティページ・inodeキャッシュを強制的に解放するらしいです。
ということで、試してみます。

検証前のメモリ状況です。

# free
             total       used       free     shared    buffers     cached
Mem:        906792      60240     846552          0       3252      29892
-/+ buffers/cache:      27096     879696
Swap:      1012052          0    1012052
# cat /proc/meminfo (抜粋)
MemTotal:       906792 kB
MemFree:        846568 kB
Buffers:          3268 kB
Cached:          29892 kB
Active:          34940 kB
Inactive:        17792 kB
Dirty:             108 kB

1GBのダミーファイルを読み込みます。
ファイル読み込み後、メモリ状況を確認します。

# dd if=tempfile of=/dev/null bs=1024
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 7.12866 seconds, 151 MB/s
# free 
             total       used       free     shared    buffers     cached
Mem:        906792     897976       8816          0       2184     867696
-/+ buffers/cache:      28096     878696
Swap:      1012052          0    1012052
# cat /proc/meminfo 
MemTotal:       906792 kB
MemFree:          8816 kB
Buffers:          2216 kB
Cached:         867696 kB
Active:          32724 kB
Inactive:       856756 kB
Dirty:              16 kB

cached(ページキャッシュ)が増大しています。


sysctlコマンドで、カーネルパラメータを変更します。

# sysctl -w vm.drop_caches=1
vm.drop_caches = 1
# free 
             total       used       free     shared    buffers     cached
Mem:        906792      35864     870928          0        140       8328
-/+ buffers/cache:      27396     879396
Swap:      1012052          0    1012052
# cat /proc/meminfo 
MemTotal:       906792 kB
MemFree:        870868 kB
Buffers:           192 kB
Cached:           8344 kB
Active:          27868 kB
Inactive:          240 kB
Dirty:              68 kB

cached(ページキャッシュ)が解放されて、MemFreeが増加しています。


vm.drop_cachesへ引き渡すパラメータにより、以下のような動作になります。

  • 0 -> 初期値
  • 1 -> ページキャッシュの解放
  • 2 -> ダーティページとinodeキャッシュの解放
  • 3 -> ページキャッシュとダーティページとinodeキャッシュの解放

vm.drop_cachesの値は、/proc/sys/vm/drop_cachesファイルに設定されます。


今回は未検証ですが、キャッシュの解放によりパフォーマンスの低下が考えられます。
また、キャッシュ解放前にはsyncコマンドを実行した方が良いです。

*1:カーネル2.6.16以降から有効なパラメータです。