Eu tenho uma árvore de diretórios que contém muitos arquivos pequenos e um pequeno número de arquivos maiores. O tamanho médio de um arquivo é de aproximadamente 1 kilobyte. Há 210158 arquivos e diretórios na árvore (este número foi obtido através da execução find | wc -l
).
Uma pequena porcentagem de arquivos é adicionada / excluída / reescrita várias vezes por semana. Isso se aplica aos arquivos pequenos, bem como ao (pequeno número de) arquivos maiores.
Os sistemas de arquivos que eu tentei (ext4, btrfs) têm alguns problemas com o posicionamento dos arquivos no disco. Por um período maior, as posições físicas dos arquivos no disco (mídia rotativa, não disco de estado sólido) estão se tornando mais distribuídas aleatoriamente. A conseqüência negativa dessa distribuição aleatória é que o sistema de arquivos está ficando mais lento (como: 4 vezes mais lento que um sistema de arquivos novo).
Existe um sistema de arquivos Linux (ou um método de manutenção do sistema de arquivos) que não sofre com essa degradação do desempenho e é capaz de manter um perfil de desempenho estável em uma mídia rotativa? O sistema de arquivos pode ser executado no Fuse, mas precisa ser confiável.
Respostas:
atuação
Eu escrevi um pequeno Benchmark ( fonte ), para descobrir qual sistema de arquivos funciona melhor com centenas de milhares de arquivos pequenos:
excluir todos os arquivos
sincronizar e soltar cache após cada etapa
Resultados (tempo médio em segundos, menor = melhor):
Resultado:
Embora o Ext4 tenha um bom desempenho geral, o ReiserFS foi extremamente rápido na leitura de arquivos seqüenciais. Acontece que o XFS é lento com muitos arquivos pequenos - você não deve usá-lo neste caso de uso.
Problema de fragmentação
A única maneira de impedir que os sistemas de arquivos distribuam arquivos pela unidade é manter a partição do tamanho que você realmente precisa, mas preste atenção para não tornar a partição muito pequena, para evitar a fragmentação intra-arquivo. Usar o LVM pode ser muito útil.
Leitura adicional
O Arch Wiki possui ótimos artigos sobre o desempenho do sistema de arquivos:
https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types
https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices
fonte
Estou usando o ReiserFS para esta tarefa, especialmente feita para lidar com muitos arquivos pequenos. Existe um texto fácil de ler sobre isso no wiki do funtoo.
fonte
O desempenho ext4 diminui após 1-2 milhões de arquivos em um diretório. Veja esta página http://genomewiki.ucsc.edu/index.php/File_system_performance criado por Hiram Clawson na UCSC
fonte
O XFS é conhecido por ter um desempenho muito bom em situações como esta. Isso é parte do motivo de usá-lo no meu trabalho para nossos armazenamentos de correio (que pode conter centenas de milhares de arquivos em um diretório). Possui melhor tolerância a falhas que o ReiserFS, é muito mais usado e geralmente é um sistema de arquivos muito maduro.
Além disso, o XFS oferece suporte à desfragmentação online. Embora ele use uma técnica de alocação atrasada que resulta em menos fragmentação (vs outros sistemas de arquivos) para começar.
fonte
syslogd
padrão típico .) Por exemplo, ao meu lado em uma configuração de XFS sobre MD, observei que a remoção de um arquivo de 1,5 GB levou 4,75 minutos (!) Enquanto a unidade de disco estava limitada a um limite de 100 transações / s a uma taxa de gravação de mais de 2 MB / s. Isso também afeta muito o desempenho de outras operações de E / S em paralelo na mesma unidade, pois a unidade já está no máximo. Nunca vi nada parecido em outros FS (ou sendo testado em benchmarks).