Linuxでファイルシステムメタデータをキャッシュする方法と場所

Linuxでファイルシステムメタデータをキャッシュする方法と場所

私の前の質問明らかに間違った前提があります。私はファイルシステムのメタデータがinodeキャッシュとdentryキャッシュにキャッシュされていると思いましたが、そうではありません。

私がするとき:

# time find . > /dev/null

real    10m4.435s
user    0m3.904s
sys     0m15.505s

# time find . > /dev/null

real    0m5.681s
user    0m1.400s
sys     0m4.224s

2回目の実行がはるかに高速になったことがわかります。しかし、私はリリースページキャッシュのみ:

echo 1 > /proc/sys/vm/drop_caches

Slabtopこれらのキャッシュを削除した後も、大きなキャッシュが表示されます。

   OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
1758897 1758713  99%    0.19K  83757       21    335028K dentry
1216908 1211861  99%    0.76K  57948       21    927168K ext3_inode_cache

echo 3 > /proc/sys/vm/drop_cachesとにかく、すべてのキャッシュ()を削除した後でもslabtopまだ大きなキャッシュサイズが報告されるため、どのように機能するのか理解できません。

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
1288434 955168  74%    0.19K  61354       21    245416K dentry                 
1216908 1211861  99%    0.76K  57948       21    927168K ext3_inode_cache

その後、取得したデータはfindページキャッシュに保存されますか?毎日のバックアップによってディスクIOが発生しないように、このデータをキャッシュに永続的に保存したいのですが、page_cacheに保存されている場合は制御できませんvfs_cache_pressure

編集する:

find と echo 2 を実行するとdrop_caches(dentry キャッシュと inode キャッシュが削除されます)、検索はまだ高速で、タブレット使用率は引き続き/proc/meminfo表示されます。

# time find . > /dev/null    
real    8m11.918s
user    0m3.888s
sys     0m15.313s

# echo 2 > /proc/sys/vm/drop_caches

# time find . > /dev/null
real    0m8.883s
user    0m1.540s
sys     0m4.724s

とメモリ情報:

# cat /proc/meminfo |grep -i "^cache\|Slab"
Cached:           425224 kB
Slab:             891648 kB

echo 2 > /proc/sys/vm/drop_caches

# cat /proc/meminfo |grep -i "^cache\|Slab"
Cached:           333740 kB
Slab:             793428 kB

これはext3のUbuntu 12.04です。

ベストアンサー1

これはテストに欠陥があるためです。find .ディレクトリツリーのgetdents()のみが実行時に呼び出されます。この場合、ディレクトリはディレクトリエントリを含むファイルにすぎないため、ページキャッシュに保存されます。実際には何もしないことに注意してください。使用する権利この方法でキャッシュしたいファイルです。

テストは基本的にファイルシステムツリーのすべてのディレクトリをキャッシュし、それ以外は何もキャッシュしません。

より難しい作業を試してみてくださいfind。たとえば、強制的にすべてのファイルを呼び出すと、lstat他の動作が表示されます。

私のテストでは、ディレクトリに百万のファイルがありました。

[root@home test]# echo 3 >/proc/sys/vm/drop_caches 
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null

real    0m16.443s
user    0m2.123s
sys 0m9.320s
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null

real    0m2.704s
user    0m1.224s
sys 0m1.479s
[root@home test]# echo 1 >/proc/sys/vm/drop_caches 
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null

real    0m3.791s
user    0m1.359s
sys 0m1.756s

最後のテストでは少し時間がかかりました。これは、dentryキャッシュとinodeキャッシュがないためではなく、 "files"ディレクトリ自体のすべての読み取りに直接関連しているようです。

おすすめ記事