Por que esses arquivos em um volume ext4 são fragmentados?

19

Eu tenho uma ext4partição de 900 GB em um disco rígido (magnético) que não possui defeitos nem setores defeituosos. A partição está completamente vazia, exceto por um lost+founddiretório vazio . A partição foi formatada usando parâmetros padrão, exceto que eu defina o número de blocos reservados do sistema de arquivos como 1%.

Eu baixei o arquivo ~ 900MB xubuntu-15.04-desktop-amd64.isopara o diretório do ponto de montagem da partição usando wget. Quando o download foi concluído, descobri que o arquivo estava dividido em quatro fragmentos:

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

Achando que isso poderia ser revertido wget, removi o arquivo ISO da partição, deixando-o vazio novamente e copiei o arquivo ~ 700MB v1.mp4para a partição usando cp. Este arquivo também foi fragmentado. Foi dividido em três fragmentos:

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

Por que isso está acontecendo? E existe uma maneira de impedir que isso aconteça? Eu pensei que ext4era para ser resistente à fragmentação. Em vez disso, acho que ele fragmenta imediatamente um arquivo solitário quando todo o restante do volume não é utilizado. Isso parece ser pior que ambos FAT32e NTFS.

EmmaV
fonte
4
Estou tentando imaginar sob que circunstâncias isso poderia importar e estou ficando vazio.
Greg Hewgill
4
@ GregHewgill: Importava porque eu pensava que era anormal. Agora eu sei que é normal, não importa.
EmmaV

Respostas:

17

3 ou 4 fragmentos em um arquivo de 900mb são muito bons. A fragmentação se torna um problema quando um arquivo desse tamanho tem mais de 100 fragmentos. Não é incomum que o fat ou o ntfs fragmentem esse arquivo em várias centenas de pedaços.

Geralmente, você não verá melhor do que isso, pelo menos nos sistemas de arquivos ext4 mais antigos, porque o tamanho máximo de um grupo de blocos é de 128 MB e, portanto, a cada 128 MB, o espaço contíguo é quebrado por alguns blocos para os bitmaps de alocação e as tabelas de inode para o próximo grupo de blocos. Um recurso ext4 mais recente chamado flex_bg permite agrupar (normalmente 16) grupos de blocos dessas tabelas, deixando execuções mais longas de blocos alocáveis, mas dependendo da sua distribuição e de qual versão do e2fsprogs foi usada para formatá-lo, essa opção pode não foi usado.

Você pode usar tune2fs -lpara verificar os recursos ativados quando o sistema de arquivos foi formatado.

psusi
fonte
Muito interessante. Eu assumi que todas as tabelas de inodes etc. estavam no início do volume.
EmmaV
1
@EmmaV distribuí-los em todo o disco, relativamente perto os dados a que se referem, resulta em menor procura e acesso mais rápido disco :)
hobbs
10

Não consigo responder de verdade, mas acho que isso pode ajudar:

Observe como cada fragmento tem, no máximo, 32768 blocos de tamanho (uma potência de 2, que deve elevar a sinalização de que algo está acontecendo e também fornecer uma dica para algo a procurar).

Também digno de nota, essas compensações físicas entre extensões são muito próximas umas das outras.

De: Layout do disco Ext4

Um sistema de arquivos ext4 é dividido em uma série de grupos de blocos. Para reduzir as dificuldades de desempenho devido à fragmentação, o alocador de blocos tenta muito manter os blocos de cada arquivo dentro do mesmo grupo, reduzindo o tempo de busca. O tamanho de um grupo de blocos é especificado em sb.s_blocks_per_group blocks, embora também possa ser calculado como 8 * block_size_in_bytes. Com o tamanho de bloco padrão de 4KiB, cada grupo conterá 32.768 blocos, com um comprimento de 128MiB

E mais abaixo:

A primeira ferramenta que o ext4 usa para combater a fragmentação é o alocador de vários blocos. Quando um arquivo é criado, o alocador de blocos aloca especulativamente 8KiB de espaço em disco para o arquivo. Um segundo truque relacionado que o ext4 usa é a alocação atrasada. Sob esse esquema, quando um arquivo precisa de mais blocos para absorver as gravações, o sistema de arquivos adia a decisão da localização exata no disco até que todos os buffers sujos sejam gravados no disco. Ao não se comprometer com um posicionamento específico até que seja absolutamente necessário (o tempo limite de confirmação é atingido, ou sync () é chamado ou o kernel fica sem memória), a esperança é que o sistema de arquivos possa tomar melhores decisões de localização.

Então, eu diria que o alocador se preocupa apenas com a localidade dos dados dentro do grupo de blocos (aqueles blocos de 32K), mas não com os grupos de blocos contíguos um ao outro.

outlyer
fonte
A primeira citação que você deu responde à minha pergunta.
EmmaV
1
Cada extensão possui no máximo 32k blocos, porque esse é o tamanho máximo que um descritor de extensão pode cobrir. As extensões não são fragmentos. Se você observar vários blocos físicos das extensões, siga imediatamente os da extensão anterior e, portanto, não constitua um fragmento (6 extensões versus 3 fragmentos).
Psusi 18/05/2015