ファイル指定で、ページキャッシュにのっているか確認したり追い出したり
ファイル指定で、ページキャッシュにのっているか確認したり追い出したりするPerlモジュールを書きました。
Linux なら動くはずですが、動かなかったら教えてください。あと一応、FreeBSD 8.3以上でも動くと思います。
既存の実装にGoogleのlinux-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で動かしておくとよいですね。