ファイル指定で、ページキャッシュにのっているか確認したり追い出したり

ファイル指定で、ページキャッシュにのっているか確認したり追い出したりするPerlモジュールを書きました。

Linux なら動くはずですが、動かなかったら教えてください。あと一応、FreeBSD 8.3以上でも動くと思います。

既存の実装にGooglelinux-ftoolsやエヌハヤシ氏のpagecache-toolがありますが、これのPerlモジュール実装(XS)になります。


たまにfreeコマンドでみるとbuffers/cacheが食っててswapしてる(本当はbuffer/cacheを解放してメモリ割り当てて欲しいんですが…)サーバーがいます。

こういった状況を解消する/未然に防ぐために、ページキャッシュにのりがちなApacheのログファイルやMySQLのバイナリログファイルを明にページキャッシュから追い出すのに便利です。


あるファイルがページキャッシュにのっているか確認するには、Sys::PageCacheのfincore()関数を使って調べるか、同梱のpagecache-check.plを使えばよいです。

### 調べてみると、まだページキャッシュにのっていない
$ pagecache-check.pl dekai.log
dekai.log: cached/total_size=0/3221225472 cached/total_pages=0/786432

### catで読み捨てて、
$ cat dekai.log >/dev/null

### 再度調べると、ページキャッシュにのっていることが確認できる。
$ pagecache-check.pl dekai.log
dekai.log: cached/total_size=3221225472/3221225472 cached/total_pages=786432/786432


ページキャッシュから解放するには、Sys::PageCacheのfadvise()関数にPOSIX_FADV_DONTNEEDを添えて呼ぶか、同梱のpagecche-clear.plを使えばよいです。

### まず、ページキャッシュにのっているか調べる。
$ pagecache-check.pl dekai.log
dekai.log: cached/total_size=3221225472/3221225472 cached/total_pages=786432/786432

### pagecache-clear.pl でページキャッシュから追い出す。
$ pagecache-clear.pl dekai.log
dekai.log:
  before cached/total_size=3221225472/3221225472 cached/total_pages=786432/786432
  after  cached/total_size=0/3221225472 cached/total_pages=0/786432

### 念の為確認。
$ pagecache-check.pl dekai.log
dekai.log: cached/total_size=0/3221225472 cached/total_pages=0/786432


また pagecache-clear.pl にはファイルの先頭から何%の部分をページキャッシュから追い出すか指定することもできます。

$ pagecache-check.pl dekai.log
dekai.log: cached/total_size=3221225472/3221225472 cached/total_pages=786432/786432

### 先頭から70%ぐらいを追い出して、おしりの30%ぐらいはページキャッシュにのせたままにする
$ pagecache-clear.pl -r 0.7 dekai.log
dekai.log:
  before cached/total_size=3221225472/3221225472 cached/total_pages=786432/786432
  after  cached/total_size=966365184/3221225472 cached/total_pages=235929/786432

アクセスログやバイナリログなど、古い世代のファイルは全部ページキャッシュから追い出すけど、最新のファイルは少しページキャッシュにのせたままで先頭部分をページキャッシュから追い出す、といった処理も書けます。cronで動かしておくとよいですね。