Os arquivos de curta duração são liberados para o disco?

9

Meu programa cria muitos pequenos arquivos de curta duração. Eles geralmente são excluídos dentro de um segundo após a criação. Os arquivos estão em um sistema de arquivos ext4 apoiado por um disco rígido real. Eu sei que o Linux libera periodicamente ( pdflush) páginas sujas no disco. Como meus arquivos têm vida curta, provavelmente eles não são armazenados em cache pdflush. Minha pergunta é: meu programa causa muitas gravações em disco? Minha preocupação é com a vida do meu disco rígido.

Como os arquivos são pequenos, vamos assumir que a soma do tamanho é menor que dirty_bytese dirty_background_bytes.

O Ext4 tem o diário padrão ativado, ou seja, o diário de metadados. Também quero saber se os metadados ou dados estão gravados no disco.

Wu Yongzheng
fonte
> Meu programa cria muitos arquivos pequenos e de curta duração, quanto é 'muito'? Você está excluindo esses arquivos ou reescrevendo-os? > Também quero saber se os metadados ou dados estão gravados no disco. Acredito que o modo de metadados padrão seja ordenado, o que significa que os metadados são confirmados antes que os dados sejam gravados no disco. Claro que existem opções de montagem que você pode adicionar para mudar isso. > Minha pergunta é: meu programa causa muitas gravações em disco? é difícil responder a considerar as informações que você forneceu. Você já pensou em usar ferramentas como iotop e sysstat para monitorar E / S de disco?
precisa saber é o seguinte
ReiserFS é melhor para arquivos pequenos, se você realmente quer que eles para bater disco já tmpfs é bom se você não se importa
xenoterracide
Alguns esclarecimentos: (1). o sistema de arquivos ext4 não está montado com a syncopção Você pode considerar um fedora, debian ou ubuntu padrão instalado. Você escolhe um. (2) Cada arquivo tem cerca de 60 KB. (3) Cerca de 1000 arquivos são criados e excluídos por segundo, mas não existem mais de 10 arquivos a qualquer momento. Em outras palavras, a taxa de transferência de E / S é grande, mas o espaço ocupado é pequeno.
Wu Yongzheng

Respostas:

5

Um experimento simples usando ext4:

Crie uma imagem de 100 MB ...

# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s

Torná-lo um dispositivo de loop ...

# losetup -f --show image
/dev/loop0

Faça o sistema de arquivos e monte ...

# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp

Faça algum tipo de execução com arquivos de curta duração. (Altere para qualquer método que você preferir.)

for ((x=0; x<1000; x++))
do
    (echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
     sleep 1
     rm /mnt/tmp/short-lived-file-$x ) &
done

Umount, sync, unloop.

# umount /mnt/tmp
# sync
# losetup -d /dev/loop0

Verifique o conteúdo da imagem.

# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3

No meu caso, listou todos os nomes de arquivos, mas nenhum conteúdo. Portanto, apenas o conteúdo não foi escrito.

frostschutz
fonte
Boa tentativa. Agora estou convencido. Eu também tentei o ext2 e obtive o mesmo resultado que você. Alterei sua carga de trabalho de E / S paralela para sequencial e obtive um arquivo de vida curta-999 e um conteúdo de curta duração-8- *. Alguém tem alguma explicação?
Wu Yongzheng
@ msw: editado caso não esteja claro. Caso contrário, por favor, elabore.
Frostschutz 23/08
Isso é bobagem. Os arquivos existem simultaneamente, não havia nada para substituir e os sistemas de arquivos não substituem o conteúdo do arquivo excluído, pois isso prejudicaria o desempenho. Mas, por todos os meios, use nbde registre o tráfego (ou método semelhante para rastrear todas as gravações).
Frostschutz 23/08
7

A menos que você esteja falando de uma unidade de estado sólido, um alto número de gravações em disco não será o fator dominante na longevidade da unidade.

Se você realmente deseja evitar gravações em disco, consulte tmpfs ,

msw
fonte
2
O tmpfs é realmente um bom ajuste nesse caso, mas ainda quero saber, como uma pergunta geral do sistema operacional, os dados gravados no disco (desnecessariamente)?
Wu Yongzheng
Sua pergunta precisaria ser muito mais específica do que você provavelmente pode formular para receber uma resposta definitiva. O cache do buffer medeia uma troca complicada entre desempenho e persistência, que não pode ser respondida em abstrato. Usando as ferramentas @AngryWombat listadas, você pode medir as gravações reais de seu aplicativo específico, mas existem muitos fatores que podem fazer com que ela varie de uma execução para outra.
msw
Bem, se o pdflush vier depois que o arquivo for excluído. Escrevê-lo seria desnecessário.
Wu Yongzheng
1

Como regra geral, não, eles não serão escritos. Isso ocorre porque o cache limpa páginas sujas quando uma das duas condições é atendida:

  1. Os dados expiram depois /proc/sys/vm/dirty_writeback_centisecs, o padrão é 5 segundos.

  2. Há pouca memória para o cache reter os dados, mais do que dirty_ratiopáginas sujas no cache (o padrão é 20%).

Portanto, em um sistema com muita memória livre e pouco tráfego de gravação, exceto pelos arquivos pequenos que são excluídos em menos de 5 segundos, os dados não serão liberados.

psusi
fonte
0

O fato de os arquivos de curta duração serem gravados no disco ou não depende não apenas do comportamento padrão do cache de arquivos do kernel, mas também dos detalhes da implementação do driver do sistema de arquivos e das opções de montagem do referido sistema de arquivos. É possível configurar o sistema de forma que tudo seja imediatamente imediatamente gravado no disco (essencialmente, comportamento semelhante ao DOS).

Um sistema de arquivos, destacando o comportamento de seu interesse (a chamada "alocação atrasada") é o XFS. Com ele, você pode ter mais ou menos certeza (caso não haja opções de configuração engraçadas em outros lugares) de que os blocos pertencentes a apenas arquivos excluídos serão reutilizados na memória, sem acesso intermediário ao disco. O XFS ainda pode querer atualizar seu diário de metadados (que será gravado no disco com bastante frequência; ainda, como o diário do XFS é apenas metadado, ele é pequeno o suficiente para ser definido em outro dispositivo rápido, como a RAM suportada por bateria encontrada em muitos controladores RAID).

Devido a esse comportamento, não é incomum encontrar arquivos completamente zerados, mas de outra forma legítimos (tamanho e outros metadados intactos) em um sistema de arquivos XFS após uma súbita interrupção de energia. Esse é um custo do suporte a operações rápidas de arquivos "semi-temporários".

Alguma teoria

Em geral, uma chamada do sistema que acessa um sistema de arquivos termina rapidamente, no método definido pelo driver do sistema de arquivos (anexado a "struct inode_operations" e "struct file_operations" quando o driver VFS é registrado). O que acontece depois disso fica a critério exclusivo da implementação do sistema de arquivos. Normalmente, algo semelhante à seguinte abordagem é usada (este exemplo simples é do driver FAT do linux):

if (IS_DIRSYNC(dir))
    (void)fat_sync_inode(dir);
else
    mark_inode_dirty(dir);

Se o sistema de arquivos estiver montado no modo "sincronização", todas as alterações serão colocadas no disco imediatamente (neste caso, por meio de fat_sync_inode ()). Caso contrário, o bloco será marcado como "sujo" e permanecerá no cache de memória até ser liberado em alguma oportunidade razoável.

Portanto, é impossível prever o comportamento do sistema em relação aos arquivos transitórios sem considerar as opções de montagem do sistema de arquivos e inspecionar o código fonte de sua implementação (isso, é claro, se aplica principalmente a todos os tipos de sistemas de arquivos exóticos encontrados principalmente no espaço incorporado) .

oakad
fonte
Obrigado pela sua resposta. Parece que ext4 também atrasou a alocação. Isso significa que minha resposta é NÃO? (sem opções de configuração engraçadas em outros lugares). Isso também significa que minha resposta é SIM se o ext2 for usado?
Wu Yongzheng
Eu pensaria que, mesmo com o ext2 no kernel moderno, a resposta será NÃO. Esta questão em particular foi discutida muito e uma breve olhada na fonte do kernel mostra que o driver ext2 depende principalmente de operações "padrão" do kernel para fazer suas coisas (assim, tudo é atrasado pelo cache do bloco). Suponho que devo atualizar minha resposta para incluir algumas informações extras.
oakad
Obviamente, meu ext4 não está montado com a syncopção Eu nunca faria isso.
Wu Yongzheng
Ao marcar um inode como sujo, presumo que o sistema de arquivos seja responsável por marcar a página correspondente como suja. Mais tarde, quando o inode é excluído, o sistema de arquivos limpa a página suja? Caso contrário, os dados serão liberados no disco desnecessariamente.
Wu Yongzheng
2
Os blocos de dados não utilizados são "liberados" e, portanto, deixam de estar sujos. Se você escreveu algumas coisas para arquivar e depois as truncou antes da liberação, o lixo após o EOF simplesmente desaparece (mais ou menos). Com os metadados, pode não ser tão simples, porque pode haver várias compensações relacionadas à integridade das estruturas de dados do sistema de arquivos. A propósito, não é óbvio da sua pergunta que você sempre espera ter controle total da sua plataforma - a maioria dos aplicativos geralmente termina em máquinas com configuração desconhecida, longe do desenvolvedor.
oakad