Alocação física contígua de um conjunto de arquivos no sistema de arquivos linux (ext4)

4

Eu tenho um conjunto de arquivos que desejo ser alocado contiguamente no sistema de arquivos. Eu estarei acessando todos esses arquivos sequencialmente em uma única leitura, um após o outro, e quero otimizar a leitura deles. Não posso combiná-los em um único arquivo e estou procurando uma solução que permita que eles sejam arquivos individuais.

Estou usando um sistema de arquivos ext4 e fiquei me perguntando se há alguma ferramenta existente que possa fazer isso para mim, pois aprendi que o ext4 suporta troca de bloco e desfragmentação online. Eu tentei usar e4defrag no meu diretório de arquivos, embora ele assegurasse que cada arquivo individual fosse desfragmentado, cada arquivo em si estava em um bloco separado, não necessariamente adjacente aos outros arquivos. (Eu usei filefrag -v file_name para verificar se eles estavam sendo alocados próximos uns dos outros ou não)

EDIT: Apenas para esclarecer os padrões de acesso a arquivos, esses arquivos serão gravados exatamente uma vez e nunca serão modificados novamente. Eles serão lidos freqüentemente, mas de tal maneira que se qualquer um deles for lido, todos os outros arquivos no conjunto provavelmente também serão necessários para serem lidos. O que pretendo fazer é pré-buscar todos esses arquivos juntos no buffer / cache do sistema de arquivos de uma só vez, para que as leituras aleatórias subseqüentes de qualquer um desses arquivos sejam realmente rápidas. (O tamanho total do arquivo é pequeno o suficiente 100 ~ 200MB para caber no cache). O que estou tentando melhorar agora é o desempenho de leitura quando tento carregar esses arquivos no cache. No momento, o desempenho da leitura leva um golpe ao tentar pré-buscá-los no cache, pois há várias buscas no disco, pois elas estão localizadas em segmentos separados.

    
por phininity 11.11.2013 / 06:56

1 resposta

0

Não é exatamente uma maneira de reorganizar os blocos do sistema de arquivos, mas…

Você quer ter os arquivos na RAM e disse nos comentários que você já havia experimentado o ramdisk. Podemos melhorar essa abordagem.

Minha idéia é ler arquivos não diretamente de um sistema de arquivos como ext4 , mas de um arquivo .tar . Você criaria esse arquivo uma vez, colocaria em ext4 filesystem e desfragmentaria com e4defrag . Então a cada inicialização

cd /mnt/target_tmpfs/ &&  tar -xf /mnt/ext4/defragmented_archive.tar

Eu não acho que tar irá procurar em um determinado arquivo, buscar para frente e para trás. Mas se você acha que sim, então você sempre pode usar cat … | tar -x . Nesse caso, tar só pode ler sua entrada de maneira contínua e no máximo uma vez.

Estou ciente de que você não pode facilmente carregar todo o sistema operacional dessa maneira, a menos que você possa preparar initramfs para fazer isso. Não sei muito sobre isso, mas descobri isso: Initramfs personalizados . De lá:

Here are some examples of what you can do with initramfs:

  • Mount the root partition (for encrypted, logical, and otherwise special partitions);
  • […]

Veja scripts de exemplo lá . Montando ext4 , então tmpfs e preenchendo-o de .tar , então usando isso como / - tudo parece possível em geral.

Obviamente, você gostaria que seu custom-initramfs.cpio.gz fosse desfragmentado, assim como o arquivo .tar .

    
por 09.12.2017 / 00:50