it-swarm-pt.com

Número de arquivos por diretório

Eu tenho um diretório com cerca de 100.000 pequenos arquivos (cada arquivo tem 1-3 linhas, cada arquivo é um arquivo de texto). Em tamanho, o diretório não é muito grande (<2 GB). Esses dados residem em um servidor NFS administrado profissionalmente. O servidor roda Linux. Acho que o sistema de arquivos é ext3, mas não tenho certeza. Além disso, não tenho acesso root ao servidor.

Esses arquivos são o resultado de um experimento científico em grande escala, sobre o qual não tenho controle. No entanto, tenho que analisar os resultados.

Qualquer operação/processamento de E/S neste diretório é muito, muito lento. Abrir um arquivo (fopen em python), ler de um arquivo aberto, fechar um arquivo, tudo é muito lento. Em bash ls, du, etc. não funcionam.

A questão é:

Qual é o número máximo de arquivos em um diretório no Linux de forma que seja prático processar, fopen, ler, etc? Eu entendo que a resposta depende de muitas coisas: tipo de fs, versão do kernel, versão do servidor, hardware, etc. Eu só quero uma regra prática, se possível.

18
carlosdc

Como você supõe, depende de muitas coisas, principalmente do tipo e das opções do sistema de arquivos e, até certo ponto, da versão do kernel. Na série ext2/ext3/ext4, houve uma grande melhoria quando o dir_index opção apareceu (algum tempo após o lançamento inicial do ext3): faz com que os diretórios sejam armazenados como árvores de pesquisa (acesso de tempo logarítmico) ao invés de listas lineares (acesso de tempo linear). Isso não é algo que você pode ver no NFS, mas se você tiver algum contato com os administradores, pode pedir a eles que executem tune2fs -l /dev/something |grep features (talvez até convencê-los a atualizar?). Apenas o número de arquivos é importante, não seu tamanho.

Mesmo com dir_index, 100.000 parece grande. O ideal é obter os autores do programa que cria os arquivos para adicionar um nível de subdiretórios. Para nenhuma degradação de desempenho, eu recomendaria um limite de cerca de 1000 arquivos por diretório para ext2 ou ext3 sem dir_index e 20000 com dir_index ou reiserfs. Se você não pode controlar como os arquivos são criados, mova-os para diretórios separados antes de fazer qualquer outra coisa.

21