サーバーのメモリのグラフを見ているとどうもページキャッシュがどんどん増えているという状況があったとします
そんな時に例えば Nginx のログとか明確にページキャッシュに乗っていそうなログがあればいいのですが,心当たりがないのにどんどん増えているのは不穏なのでどのファイルがページキャッシュに乗っているのか調べたいです
そんな時に役立つのは cpan モジュールの Sys::PageCache
です
これを cpanm でインストールすれば pagecache-check.pl
と pagecache-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
とかで絞りましょう
ちなみに今回はとあるログファイルのログローテートがコケていてすごくでかくなっていることが原因でした
このワンライナーを使えば一発で気付けたので皆さんも何かおかしいと思ったらぜひ使ってください