Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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 とかで絞りましょう

ちなみに今回はとあるログファイルのログローテートがコケていてすごくでかくなっていることが原因でした
このワンライナーを使えば一発で気付けたので皆さんも何かおかしいと思ったらぜひ使ってください

catatsuy
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away