Edited at

ページキャッシュがどんどん増えている…そんな時に役立つワンライナー

More than 5 years have passed since last update.

サーバーのメモリのグラフを見ているとどうもページキャッシュがどんどん増えているという状況があったとします

そんな時に例えば Nginx のログとか明確にページキャッシュに乗っていそうなログがあればいいのですが,心当たりがないのにどんどん増えているのは不穏なのでどのファイルがページキャッシュに乗っているのか調べたいです

そんな時に役立つのは cpan モジュールの Sys::PageCache です

これを cpanm でインストールすれば pagecache-check.plpagecache-clear.pl というコマンドをインストールされます

そしてファイル名を指定すればそのファイルがページキャッシュにどの程度乗っているか確認できたり,ページキャッシュから追い出せたりする超便利コマンドです

このコマンドは超便利なのですがファイルを指定しなければいけないのでシステム全体でどのファイルのページキャッシュが多く乗っているのかは一つ一つ調べないといけません

そこでシステム全体でページキャッシュに多く乗っているファイルを見つけるワンライナーを書きました

find / -type f -name "*" -size +1000k -mmin -60 2> /dev/null \

| xargs sudo pagecache-check.pl 2> /dev/null \
| perl -ne 'if ((m{(.*?)\s.*cached/total_pages=(.*)/.*}) && ($2 > 0)) { print $2, "\t", $1, "\n"; }' \
| sort -nr

とりあえず find で軽くファイルを絞っておきます

権限的に開けないファイルがあるのでその時にエラーが出てしまって邪魔なので標準エラー出力を捨てています

1000kB 以上で 60 分以内に更新があるファイルにしぼります

find の出力を xargs を使って pagecache-check.pl に渡します

ここでもエラーが出ることがあって邪魔だったので標準エラー出力を捨てました

その後 pagecache-check.pl の出力はコマンドの組み合わせでパースするのが困難だったのでまた perl のお世話になりました

そして sort コマンドに渡しやすい形に出力します

そして最後に sort -nr で軽くフィニッシュです

数が多ければ head とかで絞りましょう

ちなみに今回はとあるログファイルのログローテートがコケていてすごくでかくなっていることが原因でした

このワンライナーを使えば一発で気付けたので皆さんも何かおかしいと思ったらぜひ使ってください