atualizações eficazes de arquivos no Linux

atualizações eficazes de arquivos no Linux

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


1. basta atualizar o respectivo arquivo
2. excluir o arquivo antigo e salvar o novo


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

Responder1

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

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

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

Responder2

Se você o estiver atualizando MUITO, o conteúdo dos arquivos obsoletos provavelmente não será um problema para você. Nesse caso, cole-o no tmpfs, trunque o arquivo na atualização e reescreva-o. Esse seria o método mais barato, pois provavelmente não usará disco.

O próximo mais próximo é truncar/gravar em um sistema de arquivos que tenha onoatimeopção de montagem definida e diário desativado. Mas, novamente, é arriscado se você falhar, pois poderá perder os dados.

Depois disso, é noatime novamente com o diário ativado.

Lembre-se, os buffers do Linux gravam e sincronizam no disco em intervalos determinados, então você normalmente não 'sentirá' o impacto de uma gravação do ponto de vista de E/S (a menos que seja uma gravação muito pesada, mas que seja ajustável). Você também pode alterar as condições de sincronização com o disco para que o buffer de gravação fique cheio por um longo tempo antes de sincronizar com o disco.

Se você está fazendo algo realmente inteligente... use fallocate para pré-alocar espaço para o arquivo, qual seria seu valor máximo possível. Em seguida, 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 liberar de volta para o disco com a chamada msync.

Responder3

Supondo um arquivo FLAT, e não um arquivo de banco de dados, prós e contras de qualquer método:

  1. Se você simplesmente substituir 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 a ideal.

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

informação relacionada