私の前の質問明らかに間違った前提があります。私はファイルシステムのメタデータが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"ディレクトリ自体のすべての読み取りに直接関連しているようです。