Linux에서 파일 시스템 메타데이터가 캐시되는 방법과 위치

Linux에서 파일 시스템 메타데이터가 캐시되는 방법과 위치

내 이전 질문분명히 잘못된 전제가 있습니다. 파일 시스템 메타데이터가 inode 및 dentry 캐시에 캐시되어 있다고 생각했는데 그렇지 않은 것 같습니다.

내가 할 때 :

# time find . > /dev/null

real    10m4.435s
user    0m3.904s
sys     0m15.505s

# time find . > /dev/null

real    0m5.681s
user    0m1.400s
sys     0m4.224s

두 번째 실행이 훨씬 빨라진 것을 볼 수 있습니다. 하지만 내가릴리스 페이지 캐시만:

echo 1 > /proc/sys/vm/drop_caches

Slabtop이러한 캐시를 삭제한 후에도 여전히 큰 캐시가 표시됩니다.

   OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
1758897 1758713  99%    0.19K  83757       21    335028K dentry
1216908 1211861  99%    0.76K  57948       21    927168K ext3_inode_cache

echo 3 > /proc/sys/vm/drop_caches어쨌든 모든 캐시( ) 를 삭제한 후에도 slabtop여전히 큰 캐시 크기가 보고되기 때문에 어떻게 작동하는지 이해할 수 없습니다 .

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
1288434 955168  74%    0.19K  61354       21    245416K dentry                 
1216908 1211861  99%    0.76K  57948       21    927168K ext3_inode_cache

그러면 획득한 데이터는 find페이지 캐시에 저장되나요? 매일 백업으로 인해 디스크 IO가 발생하지 않도록 이 데이터를 캐시에 영구적으로 저장하고 싶지만 page_cache에 저장되어 있으면 이를 제어할 수 없습니다 vfs_cache_pressure.

편집하다:

find 및 echo 2를 수행하면 drop_caches(dentry 및 inode 캐시가 삭제됨) 찾기가 여전히 빠르고 /proc/meminfo태블릿 사용량이 계속 표시됩니다.

# time find . > /dev/null    
real    8m11.918s
user    0m3.888s
sys     0m15.313s

# echo 2 > /proc/sys/vm/drop_caches

# time find . > /dev/null
real    0m8.883s
user    0m1.540s
sys     0m4.724s

및 메모리 정보:

# cat /proc/meminfo |grep -i "^cache\|Slab"
Cached:           425224 kB
Slab:             891648 kB

echo 2 > /proc/sys/vm/drop_caches

# cat /proc/meminfo |grep -i "^cache\|Slab"
Cached:           333740 kB
Slab:             793428 kB

이것은 ext3의 우분투 12.04입니다.

답변1

이는 테스트에 결함이 있기 때문입니다. find .디렉토리 트리의 getdents()만 런타임 시 호출됩니다. 이 경우 디렉토리는 디렉토리 항목을 포함하는 파일일 뿐이므로 페이지 캐시에 저장됩니다. 실제로는 아무것도 하지 않는다는 점에 유의하세요.사용할 권리이 방법으로 캐시하려는 파일입니다.

테스트는 기본적으로 파일 시스템 트리의 모든 디렉터리를 캐싱하고 그 외에는 아무것도 캐싱하지 않습니다.

더 어려운 작업을 시도하여 테스트해 보십시오 find. 예를 들어 강제로 모든 파일을 호출하면 lstat다른 동작이 표시됩니다.

내 테스트에서는 디렉터리에 백만 개의 파일이 있었습니다.

[root@home test]# echo 3 >/proc/sys/vm/drop_caches 
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null

real    0m16.443s
user    0m2.123s
sys 0m9.320s
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null

real    0m2.704s
user    0m1.224s
sys 0m1.479s
[root@home test]# echo 1 >/proc/sys/vm/drop_caches 
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null

real    0m3.791s
user    0m1.359s
sys 0m1.756s

마지막 테스트에서는 시간이 약간 더 걸렸습니다. 이는 dentry 및 inode 캐시가 없기 때문이 아니라 "files" 디렉터리 자체의 모든 읽기와 직접 관련이 있는 것 같습니다.

답변2

내 시스템(CentOS 7 x86_64)에서는 find . /usr/i/dentry 캐시만 로드되고 페이지 캐시는 로드되지 않는 것 같습니다.

"깨끗한" 상태를 형성해 보겠습니다.

echo 3 > /proc/sys/vm/drop_caches

cat /proc/meminfo | grep -i "^cache\|Slab"
Cached:           280432 kB
Slab:              66632 kB

지금,time find . /usr/ > /dev/null 2>/dev/null

real    0m5.126s
user    0m0.580s
sys     0m2.939s

cat /proc/meminfo | grep -i "^cache\|Slab"
Cached:           283308 kB
Slab:             288656 kB

Slab의 크기만 늘어났습니다. 이제 i/dcache를 삭제해 보겠습니다.

echo 2 > /proc/sys/vm/drop_caches

cat /proc/meminfo | grep -i "^cache\|Slab"
Cached:           282704 kB
Slab:              66428 kB

슬래브 크기가 급격히 감소합니다. time find . /usr/ > /dev/null 2>/dev/null주다

real    0m5.122s
user    0m0.624s
sys     0m2.905s

같은 상기와. 페이지 캐시만 삭제

echo 1 > /proc/sys/vm/drop_caches

time find . /usr/ > /dev/null 2>/dev/null
real    0m0.848s
user    0m0.256s
sys     0m0.575s

보시다시피 페이지 캐시를 삭제하면아니요충격의 속도 find는 여전히 이전보다 훨씬 빠릅니다.

관련 정보