dentry
dentry は Directory Entry の略
Linuxファイルシステムにおいて、ファイル名やディレクトリ構造に関する情報をあつかう構造体であり、関連するいくつかの情報を持つ。 ファイル名からその実体となる inode の関連付けを行う 別のファイル名から同じ inode に関連付けることでハードリンクを実現する
ディレクトリの親子関係を管理し、ディレクトリの構造を実現する
ファイル名やディレクトリ構造を含んだ情報をキャッシュし高速にアクセスする手段を提供する
dentry の状態
3つの状態がある。
used: inodeに紐づいており、ファイルシステムに使用されている
unused: inodeに紐づいており、ファイルシステムに使用されていない
negative: inodeに紐づいていない
この内 negative dentry は、対応する inode が存在しないことを示すものとして dentry に一時的にキャシュ情報として記録される。
dentryのキャッシュ
/proc/slabinfo を確認することで現在の使用状況が確認できる
キャッシュの削除については以下を参照
code:sh
cat /proc/slabinfo | grep dentry
そのため /proc/slabinfo は確認できない。
ext3,ext4 における dentry とそのサイズ
ext3, ext4 などのファイルシステムで1ディレクトリに数百万ファイルのような膨大な数を一度記録したあとで、その中のファイルをすると、中のファイル数は減っているのに、ディレクトリの一覧を取得することに長い時間を必要とする。 これは一度作られた膨大なサイズの dentry が作られてしまい、ファイル削除後もその一覧が確保されたままとなるため。これらが ディレクトリ自体のサイズを肥大化させており、一覧を取得するために著しい時間がかかる原因になる。
こうなったら該当ディレクトリを作り直す他ない。
メールボックスの受信メッセージが著しい量があってその後消した、というときに陥ったりする事象。
code:sh
# 例: 中身が 0 のディレクトリ
# ls -ld fuga/
drwxr-xr-x 2 root root 4096 Feb 3 23:51 fuga/
# 例: 中身が 11281 のディレクトリ
# ls -ld hoge/
drwxr-xr-x 2 root root 225280 Feb 3 23:51 hoge/
# ls -1 ./hoge/* | wc -l
11281
# 中身を削除してもサイズが減らない例
# ls -1 ./hoge/* | wc -l
11281
# rm -rf ./hoge/*
# ls -1 ./hoge/* | wc -l
ls: cannot access './hoge/*': No such file or directory
0
# ls -ld ./hoge
drwxr-xr-x 2 root root 225280 Feb 3 23:53 ./hoge
関連