Os arquivos são salvos no disco seqüencialmente?

22

Pelo que entendi, "arquivo esparso" significa que o arquivo pode ter 'lacunas'; portanto, os dados reais usados ​​podem ser menores que o tamanho do arquivo lógico.

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

  1. Um arquivo pode ser salvo não sequencialmente 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 ao deslocamento X +).
  2. Posso, de alguma forma, controlar a seqüencialidade do arquivo?
    Eu quero alocar um arquivo de 10GB. Quero que seja seqüencial no disco e não dividido entre diferentes compensações.
  3. Ele age de maneira diferente entre os diferentes tipos?
hudac
fonte
Você pode querer ler ext4.wiki.kernel.org/index.php/Main_Page
roaima
1
Talvez, se eu entendi corretamente sua intenção, você estaria mais interessado na API de nível inferior, onde trabalha com dispositivos de armazenamento sem precisar passar pela camada do sistema de arquivos. Seu ponto de entrada poderia ser o dmsetupprograma, uma interface para o mapeador de dispositivos. Essa pode ser uma boa opção se você estiver planejando um armazenamento semelhante ao banco de dados.
Wvxvw
4
Este é um detalhe de implementação do sistema de arquivos. Quase todos os sistemas de arquivos fazer arquivos fragmento por padrão; apenas iso9660e romfssão incapazes de fazer isso e exigem armazenamento contínuo (dentre esses eu posso listar de cabeça para baixo).
mirabilos
2
se o arquivo é contíguo no disco ou não, a leitura / gravação de dados sempre será contígua, a menos que você procure outra parte do arquivo. Então, por que você se importa com isso? A menos que a fragmentação é um problema grave que afeta o desempenho
phuclv
3
@ hudac Uma coisa a ter em mente é que o contíguo não é tão útil na prática. O mais fácil é o flash, onde a fragmentação não é grande coisa, mas em um prato giratório você ainda pode não se beneficiar de dados contíguos. Em uma bandeja giratória, você precisa pensar sobre seus padrões de acesso e onde estão os dados. Se você precisa do setor que acabou de passar pela cabeça, precisa esperar que ele volte a funcionar completamente. Para obter os melhores resultados, você deseja escalonar os dados para que fiquem "próximos" quando precisam ser lidos. Aumentar tamanho do cache é mais fácil ;-)
Ukko

Respostas:

41

Um arquivo pode ser salvo não sequencialmente no disco? Quero dizer, parte do arquivo está localizada no endereço físico X e a outra parte no endereço físico Y, que não é próximo do deslocamento X +).

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

De alguma forma, posso controlar a seqüencialidade do arquivo? Eu quero alocar um arquivo grande de 10GB. Quero que seja seqüencial em disco e não dividido entre diferentes compensações.

Você pode informar ao sistema de arquivos o tamanho alvo do seu arquivo quando ele for criado; isso ajudará o sistema de arquivos a armazená-lo de maneira ideal. Muitos sistemas de arquivos modernos usam uma técnica conhecida como alocação atrasada, em que 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 posix_fallocate(3)função para informar ao sistema de arquivos quanto espaço em disco deve ser alocado no total. Os sistemas de arquivos modernos tentarão executar essa alocação sequencialmente.

Ele age de maneira diferente entre os diferentes tipos?

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

Stephen Kitt
fonte
1
O uso fallocate(3)garantirá a seqüencialidade do arquivo? ou apenas indicará o sistema de arquivos? Não consigo entender completamente a partir das páginas de manual.
Hudac
6
Não pode garantir alocação sequencial, é apenas uma dica. Mas você definitivamente deve usá-lo se estiver escrevendo arquivos 10GiB!
Stephen Kitt
6
Essencialmente, todos os sistemas de arquivos mais sofisticados que o FAT - que remontam ao Berkeley UFS original - dividem intencionalmente arquivos grandes e os espalham por vários "grupos de alocação"; isso os ajuda a minimizar a fragmentação geral do disco. Não pode ser uma maneira de ajustar como isso funciona, mas há boas chances que você tem que recriar o sistema de arquivos a partir do zero, a fim de fazê-lo, e provavelmente não há uma maneira de transformá-lo completamente.
Zwol
2
@hudac É impossível garantir a seqüencialidade em todos os casos (veja o caso de uma unidade que está quase cheia) e, para ser sincero com o aumento dos SSDs, importa menos do que costumava (para aqueles que podem pagar pelo menos )
Muzer
1
Observe também que existem situações, como sistemas RAID, em que ter arquivos contíguos é menos eficiente, se possível. Acho que esse é realmente o objetivo de um controlador de subsistema de disco / armazenamento: descarregar todo o trabalho de armazenamento de arquivos da melhor maneira possível.
Jamesqf
17

O comando filefraginformará 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 de uma só vez, acho que seu arquivo não será fragmentado.

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

fallocate é usado para pré-alocar blocos em um arquivo. Para sistemas de arquivos que suportam a fallocatechamada do sistema, isso é feito rapidamente alocando blocos e marcando-os como não inicializados, sem necessidade de E / S para os blocos de dados. Isso é muito mais rápido do que criar um arquivo preenchendo-o com zeros.

No Linux Kernel v2.6.31, a fallocatechamada do sistema é suportada pelos sistemas de arquivos btrfs, ext4, ocfs2 e xfs.

É sequencial? O sistema primeiro tentará alocar os blocos sequencialmente. Se não puder, não o avisará.

Vouze
fonte
O que é o tipo 'ef53'. Eu também vi nos meus arquivos. Mas meu tipo de FS é ext4.
Hudac
2
EF53 é o número "SUPER_MAGIC" de ext2, ext3 e ext4. Procure em "include / uapi / linux / magic.h" nas fontes do kernel para todos os números mágicos de cada sistema de arquivos.
Vouze
No Debian, filefragestá oculto /usr/sbin. Mas parece funcionar para usuários comuns (no ext4, pelo menos). Pode ser instrutivo para o straceseu funcionamento ver como medir a fragmentação por si mesmo, se a falta de aviso for um obstáculo para você.
Toby Speight
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 só vez, do início ao fim. Não há buracos lá.

No entanto, você pode dizer "vá para a posição 1.000.000.000.000 e escreva um byte lá". Isso criará um arquivo que parece ter um tamanho grande de etabyte, mas na verdade só usa (provavelmente) 4k no disco. Este é um arquivo esparso.

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

Embora isso possa ser útil, existem duas desvantagens.

A primeira é que o arquivo será fragmentado, e é com isso que você se preocupa.

A segunda é que nem todos os programas lidam bem com esses arquivos. Por exemplo, alguns softwares de backup tentarão fazer backup do vazio e, assim, criarão um backup muito maior que o necessário, possivelmente grande demais para a mídia de backup.

Stig Hemmer
fonte
Mas mesmo um arquivo não esparso geralmente não será contíguo no disco.
Barmar
2

Posso, de alguma forma, controlar a seqüencialidade do arquivo? Eu quero alocar um arquivo de 10 GB. Quero que seja seqüencial no disco e não dividido entre diferentes compensações.

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 do ext4 etc. Os DBMSs às vezes fazem isso por razões de desempenho. A desvantagem é que você deve fazer seu próprio cache / diário / recuperação, etc., se necessário.

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


Veja também

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

RedGrittyBrick
fonte
-1

Se isso é uma coisa única e não é importante como o arquivo é armazenado originalmente, apenas o resultado importa, então você pode salvar o arquivo normalmente e executar o desfragmentador do seu sistema operacional. Em seguida, você pode verificar com esta resposta se o seu arquivo está inteiro, se não, repita. Essa é a maneira mais fácil de fazer isso, sem usar comandos ou programas externos, mas certamente não é o método mais rápido, porque desfragmenta todo o disco.

Fabian Röling
fonte
1
"Executar o desfragmentador"? Existe esse programa? A única coisa encontrada quando procurei aptitude search ~ddefragforam ddrescueviewe a nidsbiblioteca de remontagem do segmento TCP. Sua resposta não será muito útil se você não disser como o programa é chamado ou quais argumentos precisam ser passados.
precisa
1
@TobySpeight - sim, existe um desfragmentador; e4defrag.
Ravery