Os arquivos são salvos no disco sequencialmente?

22

Como eu entendi, "arquivo esparso" significa que o arquivo pode ter 'lacunas' para que os dados reais usados possam ser menores que o tamanho do arquivo lógico.

Como os sistemas de arquivos do Linux salvam arquivos no disco? Estou principalmente interessado em ext4. Mas:

  1. Um arquivo pode ser salvo não seqüencialmente no disco? Com isso, quero dizer que parte do arquivo está localizada no endereço físico X e a próxima parte no endereço físico Y, que não é próximo de X + offset).
  2. Posso de alguma forma controlar a sequencialidade do arquivo?
    Eu quero alocar um arquivo de 10GB. Eu quero que seja sequencial em disco e não dividido entre diferentes deslocamentos.
  3. Ela age de maneira diferente entre os diferentes tipos?
por hudac 13.02.2017 / 13:35

5 respostas

41

Can a file be saved not sequentially on disk? I mean, part of the file is located under physical address X and the other part under physical address Y which isn't close to X + offset).

Sim; isso é conhecido como fragmentação de arquivos e não é incomum, especialmente com arquivos maiores. A maioria dos sistemas de arquivos aloca espaço conforme necessário, mais ou menos sequencialmente, mas eles não podem adivinhar comportamento futuro - então se você escrever 200MBi em um arquivo, adicionar 100MiB, há uma chance diferente de zero de que ambos os conjuntos de dados ser armazenado em diferentes áreas do disco (basicamente, qualquer outra gravação precisando de mais espaço no disco, ocorrendo após a primeira gravação e antes da segunda, poderia ficar entre as duas). Se um sistema de arquivos estiver quase cheio, a situação normalmente será pior: pode não haver uma área contígua de espaço livre grande o suficiente para conter um novo arquivo, então ele terá que ser fragmentado.

Can I somehow control the file sequentiallity? I want to allocate big file of 10GB. I want it to be sequential in disk and not divided between different offsets.

Você pode dizer ao sistema de arquivos sobre o tamanho do alvo do seu arquivo quando ele é criado; Isso ajudará o sistema de arquivos a armazená-lo de forma otimizada. Muitos sistemas de arquivos modernos usam uma técnica conhecida como alocação atrasada, na qual o layout em disco de um novo arquivo é calculado o mais tarde possível, para maximizar as informações disponíveis quando o cálculo é realizado. Você pode ajudar nesse processo usando a função posix_fallocate(3) para informar ao sistema de arquivos quanto espaço em disco deve ser alocado no total. Sistemas de arquivos modernos tentarão realizar essa alocação seqüencialmente.

Does it act differently between the different types?

Diferentes sistemas de arquivos se comportam de maneira diferente, sim. Os sistemas de arquivos baseados em log, como o NILFS2, não alocam o armazenamento da mesma maneira que os sistemas de arquivos baseados em extensão, como o Ext4, e esse é apenas um exemplo de variação.

    
por 13.02.2017 / 13:46
17

O comando filefrag informará como seu arquivo está fisicamente armazenado no seu dispositivo:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Se você escrever seu arquivo em uma só passagem, meu palpite é que seu arquivo não será fragmentado.

A página do manual de fallocate (1) é bem clara:

fallocate is used to preallocate blocks to a file. For filesystems which support the fallocate system call, this is done quickly by allocating blocks and marking them as uninitialized, requiring no IO to the data blocks. This is much faster than creating a file by filling it with zeros.

As of the Linux Kernel v2.6.31, the fallocate system call is supported by the btrfs, ext4, ocfs2, and xfs filesystems.

É sequencial? O sistema tentará primeiro alocar os blocos seqüencialmente. Se não puder, não te avisará.

    
por 13.02.2017 / 17:14
6

Você menciona arquivos esparsos e nenhuma das outras respostas os mencionou.

A maioria dos arquivos não é esparsa. A maneira mais comum de criar um arquivo é escrever tudo de uma vez, do começo ao fim. Não há buracos lá.

No entanto, você tem permissão para dizer "passe para a posição de 1.000.000.000.000 e escreva um byte lá". Isto irá criar um arquivo que parece ser um etabyte grande, mas na verdade usa apenas (provavelmente) 4k no disco. Este é um arquivo esparso.

Você pode fazer isso várias vezes para o mesmo arquivo, deixando pequenas quantidades de dados espalhados pelo vasto vazio.

Embora isso possa ser útil, há duas desvantagens.

O primeiro é que o arquivo será fragmentado, com o que você está preocupado.

O segundo é que nem todos os programas lidam bem com esses arquivos. Por exemplo. algum software de backup tentará fazer backup do vazio e, assim, criar um backup que é muito maior do que o necessário, possivelmente muito para o meio de backup.

    
por 14.02.2017 / 09:50
2

Can I somehow control the file sequentiality? I want to allocate a file of 10GB. I want it to be sequential on disk and not divided between different offsets.

Existem pelo menos algumas maneiras de conseguir isso.

  1. Use um sistema de arquivos com muito espaço livre e pré-aloque o espaço (por exemplo, use um marcador de fim de dados específico do aplicativo e acrescente dados aleatórios até que o tamanho do arquivo atinja 10 GB). Não é garantido que isso resulte em dados não fragmentados.

  2. Use um sistema de arquivos bruto (não cozido) em vez de ext4 etc. Os SGBDs às vezes fazem isso por motivos de desempenho. A desvantagem é que você tem que fazer seu próprio caching / journalling / recovery etc, se necessário.

Instâncias em que você ganha muito fazendo isso são relativamente raras - eu procuraria primeiro em outro lugar para otimizar o desempenho.

Veja também

É verdade que os sistemas de gerenciamento de banco de dados normalmente ignoram os sistemas de arquivos?

    
por 14.02.2017 / 16:23
-1

Se isso é apenas uma coisa de uma vez e não é importante como o arquivo é armazenado originalmente, apenas o resultado é importante, então você pode salvar o arquivo normalmente e depois executar o desfragmentador do sistema operacional. Então você pode verificar com esta resposta se o arquivo estiver em uma só peça, se não, repita. Esta é a maneira mais fácil de fazê-lo, sem usar comandos ou programas externos, mas certamente não é o método mais rápido, porque desfragmenta todo o disco.

    
por 14.02.2017 / 17:09