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についてよく知らなかったため調べてみると

monoist.atmarkit.co.jp

ファイル名やディレクトリの階層構造の管理を行い、それらの情報をキャッシュ管理してくれるとのこと。

記事上での性能テストだとdentryキャッシュがあることで、ファイル検索などの実行時間が200倍以上変わるとのことで、かなりパフォーマンスに影響があることがわかる。 (メモリに問い合わせるか、HDDに問い合わせるかでだいぶ変わるため)

今回はこれらのキャッシュ情報は一時的に解放して問題なかったためdentryを解放することで対応を行なった。

$ sudo sh -c 'echo 2 > /proc/sys/vm/drop_caches'

その後freeコマンドでメモリ使用量が空いたことを確認した。