Precisa de um contêiner de dados eficiente. Mover-se do armazenamento para a memória o mais rápido possível

7

Problema : Eu preciso copiar um grande bloco de dados de um local remoto na memória do sistema o mais rápido possível.

Cenário : tenho um sistema de processamento de dados. O sistema é construído através de scripts de shell on-the-fly usando vários componentes que são puxados de locais remotos.

Um desses componentes é um grande bloco de dados armazenados como grupos de arquivos.

O requisito que tenho é recuperar esse grande bloco de dados de um local remoto e instalá-lo na memória do sistema o mais rápido possível. Esse é um requisito para que o sistema que depende desses dados possa começar a usá-lo para processamento assim que possível após a inicialização.

Pergunta : "Qual seria o contêiner mais eficiente para meus dados?"

Soluções já experimentadas / consideradas :

  • Arquivo ISO: requer ferramentas para criação e leitura que normalmente não são nativas
  • Arquivo TAR: a extração pode levar muito tempo
  • Sistema de arquivos remoto montado como local: lento porque o conteúdo precisa ser copiado na memória
  • Instantâneo do LVM: direcione mais para backups, não criados para velocidade na restauração

Notas :

  • A perda de dados não é uma preocupação principal.
  • O procedimento de transferência de arquivos remotos não é uma preocupação principal, pois já tenho uma ferramenta adequada.
  • O sistema está atualmente usando o Ubuntu Linux.
por SunSparc 04.06.2013 / 00:14

3 respostas

0

Minha pesquisa inicial no container ISO foi aparentemente incompleta. O contêiner ISO parece ser o mais eficiente, com o objetivo de poder chegar rapidamente ao conteúdo. Isto é baseado no que minha pesquisa foi capaz de descobrir, e poderia, é claro, mudar.

Embalado em um ISO, eu posso:

  • armazene os dados remotamente
  • recupere-o rapidamente por meio de uma transferência multiparte
  • armazene localmente, diretamente na memória
  • monte rapidamente

Usando esse contêiner, consegui reduzir o processo inteiro a menos de um minuto, o que é um nível de tolerância aceitável para este projeto.

A criação deste contêiner é feita facilmente no Ubuntu com um comando semelhante ao seguinte:

mkisofs -o /tmp/data.iso /opt/data/

** Observe que isso exige genisoimage , que é facilmente instalado por meio de apt-get .

Para armazenar o arquivo diretamente na memória, criei um ramdisk no sistema de arquivos /tmp :

mount -t tmpfs -o size=3G tmpfs /tmp/data

A recuperação do contêiner pode ser feita de maneira relativamente rápida com um utilitário de transferência de várias partes. Eu usei um chamado axel dessa maneira:

axel -a -n 128 -o /tmp/data/data.iso https://s3.amazonaws.com/bucket/data.iso

Finalmente, montamos o arquivo em um sistema de arquivos local:

mount -o loop -r /tmp/data/data.iso /opt/data/

O processo de montagem é quase instantâneo, o que permite que o sistema comece a usar rapidamente os dados para processamento.

    
por 07.06.2013 / 00:29
4

"O procedimento de transferência remota de arquivos não é uma preocupação primária, pois já tenho uma ferramenta adequada."

Se você já tiver o arquivo transferido, sugiro usar o mmap (2).

    
por 04.06.2013 / 00:25
2

Você deve considerar um arquivo de imagem com um sistema de arquivos que contenha seus dados (coloque um dispositivo de loop sobre o arquivo com losetup e monte o dispositivo de loop). O caminho mais rápido provavelmente seria um sistema de arquivos read-only como o squashfs.

Isso permitiria alguns truques, se nem todos os dados forem necessários simultaneamente. Em vez de montar o dispositivo de loop, você poderia colocar um dispositivo DM sobre ele, montar um sistema de arquivos de rede (ou dispositivo de bloco de rede) com o arquivo de imagem, colocar um segundo dispositivo de loop sobre a versão de rede do arquivo e combinar ambos dispositivos de loop com o dispositivo DM.

Vamos supor que você tenha que copiar 500 MiB de dados. Você começa a copiá-lo. Assim que os primeiros 100 MiB forem transferidos, você cria os dispositivos de loop e o dispositivo DM. O dispositivo DM aponta para o dispositivo de loop do arquivo local para os primeiros 100 MiB e para o outro para o resto. Depois de, e. cada bloco transferido de 10 MiB suspende o dispositivo DM e recarrega-o com a borda deslocada por mais 10 MiB.

O risco é: se os acessos forem para a versão da rede, esses dados serão transferidos duas vezes. Então, se isso acontecer com freqüência, a transferência de dados levará mais tempo (todo o processo pode terminar antes, dependendo de suas características de acesso).

Editar 1:

Veja esta resposta minha para outra pergunta para uma explicação de como usar dispositivos DM desta forma (sem suspender / recarregar / continuar).

    
por 04.06.2013 / 00:30

Tags