drop_cache 명령을 사용하여 dentry 및 inode를 지웠음에도 불구하고 파일 시스템 메타데이터를 읽는 데 디스크 IO가 발생하지 않는 이유는 무엇입니까?

drop_cache 명령을 사용하여 dentry 및 inode를 지웠음에도 불구하고 파일 시스템 메타데이터를 읽는 데 디스크 IO가 발생하지 않는 이유는 무엇입니까?

제목에서 알 수 있듯이 "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 페이지를 삭제(지우기)하는 것입니다.

나는 blktraceinode를 읽기 위해 실제로 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_cachesblockdev --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와 슈퍼블록이 버퍼 캐시에 캐시되어 있다고 나와 있습니다. 이것이 이유입니까?

감사해요

관련 정보