正如标题所示,我对“echo # > /proc/sys/vm/drop_caches”和 blockdev --flushbufs 感到困惑。
http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf
根据 OSSTEP 的说法,如果目标 inode 没有缓存在内存中,则应该发生磁盘 IO 来读取 inode,这将在内存上生成一个 dentry 数据结构。
据我所知, echo 3 > /proc/sys/vm/drop_caches 是删除(清除)页面 cahche、inode 和 dentry。
我已经尝试blktrace
弄清楚磁盘 io 是否真的发生来读取 inode。
1)echo 3 > /proc/sys/vm/drop_caches
> 259,0 38 1 0.000000000 40641 Q R 109314048 + 32 [cat]
> 259,0 38 2 0.000004096 40641 G R 109314048 + 32 [cat]
> 259,0 38 3 0.000027108 40641 UT N [cat] 1
> 259,0 38 4 0.000027862 40641 I R 109314048 + 32 [cat]
> 259,0 38 5 0.000036393 40641 D R 109314048 + 32 [cat]
> 259,0 38 6 0.006268251 0 C R 109314048 + 32 [0]
但是,没有磁盘io来读取inode。我只能看到磁盘io读取16KB数据块。
2echo 3 > /proc/sys/vm/drop_caches
和blockdev --flushbufs /dev/nvme0n1
259,0 1 1 0.000000000 325 Q RM 74232 + 8 [cat]
259,0 1 2 0.000004854 325 G RM 74232 + 8 [cat]
259,0 1 3 0.000026263 325 D RM 74232 + 8 [cat]
259,0 1 4 0.006292470 0 C RM 74232 + 8 [0]
259,0 1 5 0.006382162 325 Q RM 109052160 + 8 [cat]
259,0 1 6 0.006385621 325 G RM 109052160 + 8 [cat]
259,0 1 7 0.006393322 325 D RM 109052160 + 8 [cat]
259,0 1 8 0.006455750 0 C RM 109052160 + 8 [0]
259,0 1 9 0.006511245 325 Q RM 109117696 + 8 [cat]
259,0 1 10 0.006512342 325 G RM 109117696 + 8 [cat]
259,0 1 11 0.006514627 325 D RM 109117696 + 8 [cat]
259,0 1 12 0.006591933 0 C RM 109117696 + 8 [0]
259,0 1 13 0.006624544 325 Q RM 109117704 + 8 [cat]
259,0 1 14 0.006625538 325 G RM 109117704 + 8 [cat]
259,0 1 15 0.006627567 325 D RM 109117704 + 8 [cat]
259,0 1 16 0.006688973 0 C RM 109117704 + 8 [0]
259,0 1 17 0.006764838 325 Q R 109314048 + 32 [cat]
259,0 1 18 0.006766035 325 G R 109314048 + 32 [cat]
259,0 1 19 0.006768078 325 UT N [cat] 1
259,0 1 20 0.006768755 325 I R 109314048 + 32 [cat]
259,0 1 21 0.006773426 325 D R 109314048 + 32 [cat]
259,0 1 22 0.006854480 0 C R 109314048 + 32 [0]
我发现块访问(+8(512 * 8 = 4KB))来读取inode。
快速浏览一下 blockdev --flushbufs 在内核代码中的工作原理就会发现它清除了超级块。
为什么磁盘io不单独使用drop_cache来读取inode?
ULK 书中说 inode 或 superblock 缓存在 buffer-cache 中。 ULK一书中说inode和superblocks被缓存在buffer-cache中。难道是这个原因吗?
谢谢