이것가상 터치(8)도구를 사용하면 메모리에 있는 하나 이상의 파일을 잠글 수 있습니다. 재귀 모드가 있지만 디렉터리는 파일을 검색하는 데만 사용되며 자체적으로 잠그지는 않습니다.
잠금을 해제할 때까지 readdir이 항상 빠르게 유지되도록 메모리에서 디렉토리를 잠그는 방법은 무엇입니까?
답변1
vmtouch
이 문제에 대한 해결책은 전혀 없습니다. 실행하도록 지시한 파일에 대해 & 작업을 vmtouch
수행합니다 .open(2)
mmap(2)
커널 캐시를 허용하더라도 readdir(2)
여전히 선형 작업입니다.여전히 많은 경우 디스크에 영향을 미칩니다.:
현재 VFS readdir 작업에서는 전체 디렉토리가 캐시에 있더라도 항상 낮은 수준의 파일 시스템이 호출됩니다.
(2017/08/07 18:40 UTC에 후속 조치):
ls -l
수행되고 있는 작업은 어쨌든 이미 쓸모가 없어진 디렉토리에 대한 래퍼 가 아닙니다 readdir
. 옵션을 사용하면 해당 옵션 내의 각 항목도 표시됩니다.readdir(2)
readdir(3)
(f)stat
getdents
-l
ls
lstat
getdents
.iterate_shared
그 자체는 주어진 파일 시스템이 & 포인터에 대한 디렉토리 파일 구조 작업을 위해 제공하는 모든 것에 대한 래퍼 일 뿐입니다 . .iterate
이 경우에는 ext4
종료됩니다 ext4_readdir
.
일부 파일 시스템은 이 계층에서 캐싱을 구현하지만(NFS가 매우 명확한 예임) 다른 파일 시스템은 여전히 디스크에 액세스할 수 있습니다.
원래 문제의 원인에 대해서는 getdents
특정 디렉터리에서 반복적으로 실행되는 일부 데몬을 작성할 수 있지만 해당 디렉터리 항목을 커널 캐시에 고정할 방법이 없습니다. 그렇지 않으면 커널이 별도의 캐시 스레드에서 데이터를 완전히 무시할 수 있습니다( 파일 시스템에 따라 다름).
ext4
간단히 말해서, 파일 시스템에 해당 기능이 있는 경우 디렉토리를 디렉토리에 색인화된 htree로 표시 dir_index
할 수 있습니다 (파일 시스템 기능이 설정된 경우 매우 작은 디렉토리도 해당 캐시를 사용합니다).chattr +I dir