Kodama's home / tips.

Linux ディスクキャッシュの開放

以下は Linux 2.6.16 以降. 2.6.15 以前では, /proc/sys/vm/bdflush で行う.

概要

ディスク装置の中のディスクの回転速度や読み書き速度と コンピュータのデータ転送速度には大きな差がある. この速度の違いを調整するために, 一時的なデータの置き場所として使われるものをバッファキャッシュと云う.

ディスク装置に組み込まれたバッファキャッシュと, 主メモリーの空いた部分にとるバッファキャッシュの2段階があることに注意. 通常は気にする必要は無いが, 能力の測定でファイルの読み書きを行う場合などに影響する.

Linux では, 主メモリーの空いた部分をディスク入出力のバッファキャッシュに使って入出力を効率化している. (メモリ−が足りない?), ディスクへの書き込みがある場合, 空きメモリーにとりあえず置いて, 後でまとめてディスクに書き込むようになっている. 読み込みの場合も, 先に適当に読み込んでおいて利用の要求に対処する準備をしている.

# free
             total       used       free     shared    buffers     cached
Mem:       3089088    2999204      89884          0     233608    2132124
-/+ buffers/cache:     633472    2455616
Swap:      5863684         12    5863672
この例では 空きメモリー(free)が 89884 と少なく見えるが,(単位は 1k bytes) 実際には 2455616 あり, その空きを buffers(233608) と cached(2132124) に割り振って有効利用している.

上記の主メモリー中のバッファキャッシュとは別に, ディスク装置の中には, コンピュータとのデータ通信と ディスクの回転待ちやヘッドの移動待ちなどのタイミングの違いを調整するため, バッファが組み込まれている.

このように, コンピュータとディスクの間には少なくとも 2段階のバッファが介在しているので, この影響を見積もるのは簡単ではない.

一時的にキャッシュを開放したい場合

ディスク入出力の能力の調査 などで, 一時的にキャッシュを開放したい場合, 以下のように /proc/sys/vm/drop_caches に書き込む. 1で ページキャッシュ, 2 で dentry,inode, 3 で ページキャッシュ,dentry,inode. この操作では, ダーティ(dirty)オブジェクトは解放されない. できるだけ多くを開放したいなら, sync(8) を実行してキャッシュとディスクを同期させておくと良い.
# sync ; echo 3 > /proc/sys/vm/drop_caches

キャッシュの状況は free で見える.

# free
             total       used       free     shared    buffers     cached
Mem:       3089088    2999204      89884          0     233608    2132124
-/+ buffers/cache:     633472    2455616
Swap:      5863684         12    5863672
主メモリーtotal(3089088) のうち cached(2132124) と buffers(233608) への割り当てが大きいため, フリーメモリーfree(89884)が少なく見えるが(単位は 1k bytes).... buffers と cached への転用を考慮した数値は -/+ buffers/cached の項に書かれている. これで見るとかなり余裕がある. (メモリ−が足りない?), キャッシュを開放すると...
# sync ; echo 3 > /proc/sys/vm/drop_caches
# free
             total       used       free     shared    buffers     cached
Mem:       3089088     235620    2853468          0        272      48000
-/+ buffers/cache:     187348    2901740
Swap:      5863684         12    5863672
バッファ キャッシュだけでなく, プログラムに割り当てて used になっていたメモリーの一部も, システムに回収されています.

ディスク装置のバッファキャッシュ

ディスク装置のバッファキャッシュを同期/開放するなら hdparm -f を使う.
# sync ; echo 3 > /proc/sys/vm/drop_caches ; hdparm -f /dev/sda

キャッシュのメモリー使用量の調整

注意. 副作用あり. チューニングのトレードオフに注意.

ページキャッシュのメモリー使用率を調整して, メモリの再利用を促進するには. /proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_ratio の値を小さくする. ここはあまりいじらないで, デフォルトで良いと思うが?

バッファキャッシュの書き込み間隔の調整

注意. 副作用あり. チューニングのトレードオフに注意.
  1. 書き込み間隔を長くした場合:
  2. 書き込み間隔を短くした場合:
  3. 値の確認:
    /proc/sys/vm/dirty_writeback_centisecs(bdflush デーモンの起動間隔,単位は 1/100 秒). pdflushデーモンが起動する間隔を指定する. この間隔でダーティなデータをディスクに書き出す.(デフォルトは5秒)

    /proc/sys/vm/dirty_expire_centisecs(ダーティなデータの保持時間, 単位は 1/100秒). この値より長時間メモリ上に存在するダーティなデータはpdflushによってディスクに書き出される. (デフォルトは30秒)

    # cat /proc/sys/vm/dirty_writeback_centisecs 
    500
    # cat /proc/sys/vm/dirty_expire_centisecs 
    3000
    
  4. 以下のように設定する:
    # echo 50 > /proc/sys/vm/dirty_writeback_centisecs 
    # echo 300 > /proc/sys/vm/dirty_expire_centisecs 
    
    又は /etc/sysctl.conf内に以下を記述する:
    vm.dirty_writeback_centisecs 50
    vm.dirty_expire_centisecs 300
    

Kodama's home / tips.