내 이전 질문분명히 잘못된 전제가 있습니다. 파일 시스템 메타데이터가 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
는 여전히 이전보다 훨씬 빠릅니다.