set setting reset

脂肪と糖にはたらくやつ

特定のディレクトリ配下のファイルキャッシュを削除する

linux-ftools - Linux command line tools for fallocate, fincore, fadvise, etc - Google Project Hosting tsuchinoko.dmmlabs.com

linux-ftools がとても便利なので、表題のことを実現するスクリプトを書きました。

clear_cache.sh

#!/bin/bash

dir="$1"

if [ -z $1 ]; then
    echo "usage: sh $0 dirname"
    exit 1
fi

tmp="/tmp/cached_files"
log="/tmp/fadvise.log"

create_cache_list()
{
    cached_files_list=`/usr/local/bin/linux-fincore --pages=false --summarize --only-cached ${dir}/* 2> /dev/null`
    echo "${cached_files_list}" | grep ${dir} | awk {'print $1'} > ${tmp}

    echo "$1"
    echo "${cached_files_list}" | tail -n 1
    echo ""
}

clear_cache()
{
    while read line
    do
        /usr/local/bin/linux-fadvise ${line} POSIX_FADV_DONTNEED >> ${log}
    done < ${tmp}
}

create_cache_list before
clear_cache
create_cache_list after
#rm ${tmp} ${log}
exit 0

例えば postgresql の xlog のファイルキャッシュを削除するとして、こんな感じです。

$ sudo clear_cache.sh /var/lib/pgsql/data/pg_xlog/
before
total cached size: 452,984,832

after
total cached size: 0