ext4
결함이없고 불량 섹터가없는 (자기) 하드 드라이브에 900GB 파티션이 있습니다. 빈 lost+found
디렉토리를 제외하고 파티션이 완전히 비어 있습니다. 예약 된 파일 시스템 블록 수를 1 %로 설정 한 것을 제외하고는 기본 매개 변수를 사용하여 파티션을 포맷했습니다.
~ 900MB 파일 xubuntu-15.04-desktop-amd64.iso
을을 사용하여 파티션의 마운트 지점 디렉토리로 다운로드했습니다 wget
. 다운로드가 완료되면 파일이 네 개의 조각으로 분할 된 것을 발견했습니다.
filefrag -v /media/emma/red/xubuntu-15.04-desktop-amd64.iso
Filesystem type is: ef53
File size of /media/emma/red/xubuntu-15.04-desktop-amd64.iso is 1009778688 (246528 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
2: 63488.. 96255: 100352.. 133119: 32768: 98304:
3: 96256.. 126975: 133120.. 163839: 30720:
4: 126976.. 159743: 165888.. 198655: 32768: 163840:
5: 159744.. 190463: 198656.. 229375: 30720:
6: 190464.. 223231: 231424.. 264191: 32768: 229376:
7: 223232.. 246527: 264192.. 287487: 23296: eof
/media/emma/red/xubuntu-15.04-desktop-amd64.iso: 4 extents found
이것이 wget
어떻게 든 관련 이 있다고 생각 하여 파티션에서 ISO 파일을 제거하고 다시 비운 다음 ~ 700MB 파일 v1.mp4
을 파티션을 사용하여 파티션에 복사했습니다 cp
. 이 파일도 조각화되었습니다. 세 개의 조각으로 나뉘 었습니다.
filefrag -v /media/emma/red/v1.mp4
Filesystem type is: ef53
File size of /media/emma/red/v1.mp4 is 737904458 (180153 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
2: 63488.. 96255: 100352.. 133119: 32768: 98304:
3: 96256.. 126975: 133120.. 163839: 30720:
4: 126976.. 159743: 165888.. 198655: 32768: 163840:
5: 159744.. 180152: 198656.. 219064: 20409: eof
/media/emma/red/v1.mp4: 3 extents found
왜 이런 일이 발생합니까? 그리고 그것을 막을 수있는 방법이 있습니까? 나는 ext4
조각화에 저항해야 한다고 생각했다 . 대신 나머지 볼륨을 모두 사용하지 않으면 독방 파일이 즉시 조각화됩니다. 이 둘보다 더 나쁜 것 같다 FAT32
와 NTFS
.
답변
900mb 파일의 3 개 또는 4 개 조각 이 매우 좋습니다. 해당 크기의 파일에 100 개 이상의 조각이 있으면 조각화가 문제가됩니다. fat 또는 ntfs가 그러한 파일을 수백 조각으로 분할하는 것은 드문 일이 아닙니다.
블록 그룹의 최대 크기는 128MB이므로 128MB마다 연속적인 공간이 할당 비트 맵 및 inode 테이블에 대한 몇 개의 블록으로 나뉘어져 있기 때문에 일반적으로 적어도 오래된 ext4 파일 시스템에서는 그보다 더 잘 보이지 않습니다. 다음 블록 그룹. flex_bg 라는 최신 ext4 기능을 사용하면 이러한 테이블의 많은 (일반적으로 16 개) 블록 그룹을 함께 묶을 수 있으므로 할당 가능한 블록이 더 오래 실행되지만 분포와 포맷에 사용 된 e2fsprogs 버전에 따라이 옵션이 사용되지 않았습니다.
tune2fs -l
파일 시스템 포맷시 활성화 된 기능을 확인하는 데 사용할 수 있습니다 .
답변
나는 정말로 대답 할 수는 없지만 이것이 도움이 될 것이라고 생각합니다.
각 프래그먼트의 크기가 최대 32768 블록 (2의 거듭 제곱 인 경우, 무언가 진행중인 플래그를 제기하고 찾아야 할 힌트를 제공함)을 확인하십시오.
또한 익스텐트 사이의 물리적 오프셋은 서로 매우 가깝습니다.
보낸 사람 : Ext4 디스크 레이아웃
ext4 파일 시스템은 일련의 블록 그룹으로 나뉩니다. 조각화로 인한 성능 문제를 줄이기 위해 블록 할당자는 각 파일의 블록을 동일한 그룹 내에 유지하기 위해 매우 노력하여 검색 시간을 줄입니다. 블록 그룹의 크기는에 지정되어
sb.s_blocks_per_group blocks
있지만 8 *으로 계산할 수도 있습니다block_size_in_bytes
. 기본 블록 크기가 4KiB 인 경우 각 그룹은 길이가 128MiB 인 32,768 개의 블록을 포함합니다.
그리고 더 아래로 :
ext4가 조각화를 막기 위해 사용하는 첫 번째 도구는 멀티 블록 할당 자입니다. 파일이 처음 생성 될 때, 블록 할당자는 추론 적으로 8KiB의 디스크 공간을 파일에 할당합니다 …] ext4가 사용하는 두 번째 관련 트릭은 지연된 할당입니다. 이 구성에서 파일에 파일 쓰기를 흡수하기 위해 더 많은 블록이 필요한 경우 파일 시스템은 모든 더티 버퍼가 디스크에 기록 될 때까지 디스크의 정확한 배치를 결정합니다. 절대적으로 필요할 때까지 (커밋 시간이 초과되거나 sync ()가 호출되거나 커널에 메모리가 부족할 때까지) 특정 배치에 커밋하지 않으면 파일 시스템이 더 나은 위치 결정을 내릴 수 있기를 바랍니다.
따라서 할당자는 블록 그룹 (32K 블록) 내의 데이터 위치 에만 신경을 쓰지만 블록 그룹이 서로 인접하지는 않습니다.