![drop_cache 명령을 사용하여 dentry 및 inode를 지웠음에도 불구하고 파일 시스템 메타데이터를 읽는 데 디스크 IO가 발생하지 않는 이유는 무엇입니까?](https://linux55.com/image/160412/drop_cache%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20dentry%20%EB%B0%8F%20inode%EB%A5%BC%20%EC%A7%80%EC%9B%A0%EC%9D%8C%EC%97%90%EB%8F%84%20%EB%B6%88%EA%B5%AC%ED%95%98%EA%B3%A0%20%ED%8C%8C%EC%9D%BC%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EB%A9%94%ED%83%80%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EC%9D%BD%EB%8A%94%20%EB%8D%B0%20%EB%94%94%EC%8A%A4%ED%81%AC%20IO%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
제목에서 알 수 있듯이 "echo # > /proc/sys/vm/drop_caches" 및 blockdev --flushbufs로 인해 혼란스러워졌습니다.
http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf
OSSTEP에 따르면 대상 inode가 메모리에 캐시되지 않은 경우 inode를 읽기 위해 디스크 IO가 발생해야 하며, 이로 인해 메모리에 dentry 데이터 구조가 생성됩니다.
내가 아는 한 echo 3 > /proc/sys/vm/drop_caches는 cahche, inode 및 dentry 페이지를 삭제(지우기)하는 것입니다.
나는 blktrace
inode를 읽기 위해 실제로 disk io가 발생하는지 알아내려고 노력했습니다.
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]
그러나 inode를 읽을 디스크 IO가 없습니다. 16KB 블록을 읽는 디스크 io만 볼 수 있습니다.
2 echo 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]
inode를 읽기 위해 블록 액세스(+8 (512 * 8 = 4KB))를 찾았습니다.
커널 코드에서 blockdev --flushbufs가 어떻게 작동하는지 간단히 살펴보면 슈퍼블록을 플러시한다는 것을 알 수 있습니다.
disk io가 inode를 읽기 위해 drop_cache만 사용하지 않는 이유는 무엇입니까?
ULK 책에서는 inode 또는 슈퍼블록이 버퍼 캐시에 캐시되어 있다고 말합니다. ULK 책에는 inode와 슈퍼블록이 버퍼 캐시에 캐시되어 있다고 나와 있습니다. 이것이 이유입니까?
감사해요