dentry_cacheの肥大化によるメモリ圧迫
Overview
dentry_cache が徐々に肥大化していきslab cacheを肥大化させメモリを圧迫していた。
内容
アラート対応でメモリ逼迫の原因調査を行なった。
サーバのメモリがcacheで占有されていることを確認した。 slabtopでキャッシュサイズ順にソートしdentryが上位の殆どを占めていることを確認した。
$ slabtop --once --sort=c | head -n 12 Active / Total Objects (% used) : xxxxxx / xxxxxx (97.3%) Active / Total Slabs (% used) : xxxxxx / xxxxxx (100.0%) Active / Total Caches (% used) : 96 / 181 (53.0%) Active / Total Size (% used) : xxxxxx / xxxxxx (98.3%) Minimum / Average / Maximum Object : xxxx / xxxx / xxxx OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME xxxxxx xxxxxx 99% xxxx xxxx 20 xxxx dentry xxxxxx xxxxxx 96% xxxx xxxx 4 xxxx ext4_inode_cache xxxxxx xxxxxx 95% xxxx xxxx 37 xxxx buffer_head xxxxxx xxxxxx 95% xxxx xxxx 7 xxxx radix_tree_node xxx xxx 100% xxxx xxxx 1 xxxx kmem_cache
dentryについてよく知らなかったため調べてみると
ファイル名やディレクトリの階層構造の管理を行い、それらの情報をキャッシュ管理してくれるとのこと。
記事上での性能テストだとdentryキャッシュがあることで、ファイル検索などの実行時間が200倍以上変わるとのことで、かなりパフォーマンスに影響があることがわかる。 (メモリに問い合わせるか、HDDに問い合わせるかでだいぶ変わるため)
今回はこれらのキャッシュ情報は一時的に解放して問題なかったためdentryを解放することで対応を行なった。
$ sudo sh -c 'echo 2 > /proc/sys/vm/drop_caches'
その後freeコマンドでメモリ使用量が空いたことを確認した。