我的印象是通过 sysctl 删除缓存vm.drop_caches
会删除全部缓存,但是当我冻结文件系统并删除页面缓存时,我仍然可以读取该目录:
# fgrep ' /mnt ' /proc/mounts
/dev/mapper/test /mnt ext2 rw,noatime 0 0
# ls /mnt
lost+found
# fsfreeze --freeze /mnt
# echo 3 > /proc/sys/vm/drop_caches
# ls /mnt
lost+found
即使在同步之后,我也可以读取文件:
# echo "hello world" > /mnt/foo
# sync
# fsfreeze --freeze /mnt
# echo 3 > /proc/sys/vm/drop_caches
# cat /mnt/foo
hello world
我想放弃全部的文件系统缓存,以便后续读取(文件和目录项)被阻止,直到文件系统使用fsfreeze --unfreeze /mnt
.我该怎么做呢?
为什么不vm.drop_caches
这样做呢?它不会删除预读缓存之类的东西吗?
答案1
解决方案是另外刷新块设备缓冲区并挂起设备映射器目标,而不是手动冻结文件系统(因为dmsetup suspend
也会冻结文件系统):
# ls /mnt
lost+found
# echo 3 > /proc/sys/vm/drop_caches
# blockdev --flushbufs /dev/mapper/test
# dmsetup suspend test
# ls /mnt
该命令现在会阻塞,并且只有在运行ls
时才会解除阻塞。dmsetup resume test