조각화는 HDD의 디렉터리 트리를 탐색할 때 불필요한 검색을 많이 생성하는 것 같습니다.
# stat -c %F 00 01 02
directory
directory
directory
# filefrag -v 00 01 02
Filesystem type is: ef53
File size of 00 is 12288 (3 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 428351942.. 428351942: 1:
1: 1.. 2: 428352760.. 428352761: 2: 428351943: last,eof
00: 2 extents found
File size of 01 is 12288 (3 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 428351771.. 428351771: 1:
1: 1.. 2: 428891667.. 428891668: 2: 428351772: last,eof
01: 2 extents found
File size of 02 is 12288 (3 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 428351795.. 428351795: 1:
1: 1.. 2: 428352705.. 428352706: 2: 428351796: last,eof
02: 2 extents found
e4defrag는 조각 모음을 할 수 없습니다
# e4defrag -v 00
ext4 defragmentation for directory(00)
[1/116] "00"
File is not regular file [ NG ]
그렇다면 디렉토리 조각 모음은 어떻게 합니까? 내용이 아니라 디렉토리 자체입니다. 이러한 디렉터리는 사용 중이므로 일반 파일 조각 모음이 사용을 방해하지 않는 것처럼 원자적으로 수행되어야 합니다.
답변1
디렉터리 인덱싱을 위한 온라인 조각 모음 도구가 없는 것 같고 오프라인 조각 모음도 도움이 되지 않는 것 같기 때문에 디렉터리 트리를 재귀적으로 다시 작성해야 했습니다.
나는 작은 도구를 작성했습니다 (조각 모음 디렉토리) 이 목적을 위해. 불행하게도 이 방법을 사용하려면 조각 모음 중에 디렉터리 트리를 사용하는 응용 프로그램을 제거해야 하므로 수백만 개의 파일을 작업할 때 많은 시간이 걸릴 수 있습니다.
답변2
여유 공간이 있는 경우 동일한 장치에 새 디렉터리의 병렬 트리를 만들고 파일을 여기에 하드 링크한 다음 헤드 디렉터리의 이름을 바꾼 다음 재부팅하거나 다른 응용 프로그램을 종료한 후 원래 디렉터리 트리를 삭제할 수 있습니다. 우리는 변경 사항을 테스트하거나 실행 중인 프로덕션 외부에 소프트웨어 버전을 설치하기 위해 최소한의 파일 공간으로 이와 같은 복제 트리를 만들곤 했습니다.
가장 어린 파일은 임시 파일일 가능성이 높으므로 각 디렉터리 디렉터리를 먼저 빌드한 다음(트리 탐색 속도 향상) 가장 오래된 파일을 먼저 빌드할 수 있습니다.
플랫 파일 및 디렉터리 이외의 파일 형식에서 이것이 어떻게 작동하는지 잘 모르겠습니다. 나는 심볼릭 링크 자체가 하드 링크이거나 명명된 파이프일 것이라고 예상합니다. 그러나 장치는 어떻습니까? 물론 커널 테이블을 반영하는 /prod 및 /dev와 같은 가짜 트리는 Linux에서 금지되어 있다고 확신합니다.