私の考えでは、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