atualizações de arquivos efetivas no Linux

1

Em uma configuração de alto desempenho (muitas atualizações simultâneas) no Linux, que é o método mais eficaz para atualizar um arquivo de 30k no disco:


1. basta atualizar o respectivo arquivo
2. exclua o arquivo antigo e salve o novo


Estou preocupado principalmente com o tempo de acesso ao disco, mas também a carga do processador pode ser um fator aqui.

    
por user46728 17.11.2011 / 21:07

3 respostas

2

O subsistema de disco e o sistema de arquivos que você está usando terão um enorme impacto aqui. Na verdade, existem tantos resultados possíveis diferentes que você provavelmente deve compará-los. No entanto:

  • tenha em mente que os pedidos de veiculação reais e síncronos estão limitados a cerca de 100 IOPS para uma unidade SATA, 200 a uma unidade SAS e variam muito de 10 IOPS a 10000 com SSDs. Multiplique o número de IOPS pelo número de unidades de dados.
  • sistemas de arquivos modernos agruparão as operações de gravação juntas. A escolha adequada do sistema de arquivos e o ajuste detalhado irão alterar os resultados por um fator de 10 a 100.
  • os controladores de armazenamento modernos podem armazenar em cache as gravações. As configurações corretas de cache write-back irão mais uma vez alterar os resultados por um fator de 10 a 1000.

Então, o hardware adequado (controlador RAID real com cache WB, SSD), software apropriado (sistema de arquivos moderno, ext3 está absolutamente fora de questão aqui, eu usaria o xfs mas o ext4 é uma opção) e ajuste apropriado programação do IO do kernel, tamanho de E / S, etc.) terá um impacto imenso.

    
por 17.11.2011 / 21:55
2

Se você está atualizando muito, então o conteúdo dos arquivos obsoletos provavelmente não será um problema para você. Se assim for, coloque-o em tmpfs, trunque o arquivo na atualização e reescreva-o. Esse seria o método mais barato, já que não é provável usar disco.

O próximo mais próximo é truncar / gravar em um sistema de arquivos que tenha o conjunto de opções de montagem noatime e o journalling desativado. Mas, novamente, é arriscado se você falhar, pois você pode perder os dados.

Depois disso, seu noatime novamente com o journalling ativado.

Lembre-se, os buffers linux escrevem e sincronizam com o disco em intervalos determinados, assim você normalmente não “sentirá” o impacto de uma gravação de um ponto de vista de E / S (a menos que seja muito pesado, mas sintonizável). Você também pode alterar as condições para sincronizar com o disco para que o buffer de gravação seja preenchido por um longo período antes da sincronização com o disco.

Se o seu depois de fazer algo realmente inteligente .. use fallocate para pré-alocar espaço para o arquivo que seria o seu valor máximo possível. Então, mmap abra o arquivo para lê-lo diretamente na memória. Então, a reescrita será quase instantânea (mas com perdas se você tiver perda de energia). Você pode então controlar quando voltar para o disco com a chamada do msync.

    
por 17.11.2011 / 22:23
1

Supondo um arquivo FLAT, e não um arquivo de banco de dados, Prós e Contras em ambos os métodos:

  1. Se você simplesmente sobrescrever o conteúdo do arquivo no local, certamente impedirá as etapas de realocação. Então você pode economizar um pouco de tempo lá. No entanto, a colocação das peças pode não ser ideal.

  2. Você pode obter um posicionamento mais ideal de dados, dependendo da fragmentação do disco. Mas será um pouco mais lento à medida que o espaço for alocado e, se você estiver executando em um ambiente mais seguro, haverá tempo necessário para zerar o bloco antes da alocação.

por 17.11.2011 / 21:19

Tags