Número máximo de arquivos em um diretório ext3 enquanto ainda obtém desempenho aceitável?

25

Eu tenho um aplicativo gravando em um diretório ext3 que ao longo do tempo cresceu para aproximadamente três milhões de arquivos. Escusado será dizer que a leitura da lista de arquivos deste diretório é insuportavelmente lenta.

Não culpo o ext3. A solução adequada seria deixar o código do aplicativo gravar em subdiretórios, como em ./a/b/c/abc.extvez de usar apenas ./abc.ext.

Estou mudando para uma estrutura de subdiretório e minha pergunta é simplesmente: aproximadamente quantos arquivos devo armazenar em um diretório ext3 enquanto ainda obtendo desempenho aceitável? Qual a sua experiência?

Ou em outras palavras; assumindo que preciso armazenar três milhões de arquivos na estrutura, quantos níveis de profundidade a ./a/b/c/abc.extestrutura deve ter?

Obviamente, essa é uma pergunta que não pode ser respondida exatamente, mas estou procurando uma estimativa do parque.

knorv
fonte

Respostas:

12

Desde que você tenha uma distribuição que ofereça suporte ao dir_indexrecurso, você poderá facilmente ter 200.000 arquivos em um único diretório. Eu o manteria em cerca de 25.000, apenas para estar seguro. Sem dir_index, tente mantê-lo em 5.000.

Ignacio Vazquez-Abrams
fonte
10

Tenha MUITO cuidado ao selecionar a divisão do diretório. "a / b / c" parece uma receita para o desastre para mim ...

Não basta fazer cegamente uma estrutura profunda de vários diretórios, digamos 100 entradas no primeiro nível, 100 entradas no segundo nível, 100 entradas no terceiro. Eu estive lá, fiz isso, peguei a jaqueta e tive que reestruturá-la quando o desempenho chegou ao crapper com alguns milhões de arquivos. :-)

Temos um cliente que fez o layout de "vários diretórios" e acaba colocando apenas de um a cinco arquivos por diretório, e isso os estava matando. 3 a 6 horas para executar um "du" nessa estrutura de diretórios. O salvador aqui era o SSD, eles não estavam dispostos a reescrever essa parte do aplicativo e um SSD reduziu esse tempo de horas para minutos.

O problema é que cada nível de pesquisa de diretório realiza buscas e buscas são extremamente caras. O tamanho do diretório também é um fator; portanto, ser menor e não maior é uma grande vitória.

Para responder à sua pergunta sobre quantos arquivos por diretório, 1.000 já ouvi falar como "ideal", mas o desempenho em 10.000 parece estar bem.

Portanto, o que eu recomendaria é um nível de diretórios, cada um com 2 caracteres, composto de letras maiúsculas e minúsculas e dígitos, para cerca de 3800 diretórios no nível superior. Você pode armazenar 14M arquivos com os subdiretórios que contêm 3800 arquivos ou cerca de 1.000 arquivos por subdiretório para arquivos 3M.

Fiz uma alteração como essa para outro cliente e fez uma enorme diferença.

Sean Reifschneider
fonte
6

Eu sugiro que você tente testar vários tamanhos de diretório com uma ferramenta de comparação, como o carimbo postal , porque existem muitas variáveis, como o tamanho do cache (no sistema operacional e no subsistema de disco), que dependem do seu ambiente específico.

Minha regra pessoal é apontar para um tamanho de diretório de <= 20k arquivos, embora eu tenha visto um desempenho relativamente decente com até 100k arquivos / diretório.

David Gelhar
fonte
3

Eu tenho todos os arquivos e pastas como:

uploads / [data] / [hora] /yo.png

e não tem nenhum problema de desempenho.

Amy B
fonte
4
E quantos arquivos você recebe por hora?
Cascabel
2

Posso confirmar em um servidor bastante poderoso, com muita memória sob uma carga decente, que 70.000 arquivos podem causar todo tipo de confusão. Fui remover uma pasta de cache com 70k arquivos e o apache começou a gerar novas instâncias até atingir o limite máximo em 255 e o sistema usou toda a memória livre (16GB, embora a instância virtual possa ter sido menor). De qualquer forma, mantê-lo abaixo de 25.000 é provavelmente uma atitude muito prudente

jriskin
fonte
1

Na minha experiência, a melhor abordagem é não projetar demais a estrutura do arquivo com antecedência. Como mencionado em pelo menos uma outra resposta, existem extensões do sistema de arquivos que lidam com o fim das questões de desempenho.

O problema que eu mais acertei é a usabilidade no lado administrativo. A menor quantidade de trabalho que você pode fazer para diminuir o número de arquivos em um diretório é provavelmente a abordagem que você precisa agora.

sqrt (3_000_000) == 1732

Alguns milhares de arquivos em um único diretório parecem razoáveis ​​para mim. Seja seu próprio juiz para sua própria situação. Para conseguir isso, tente dividir os arquivos em um único nível de diretórios hash, para que o número médio de arquivos por diretório seja aproximadamente o mesmo que o número de diretórios.

Dado o seu exemplo disso seria ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

A distribuição dos arquivos dependerá muito dos nomes de arquivos reais. Imagine aplicar essa técnica a um diretório com um milhão de arquivos nomeados cada um foobar???.txt. Existem maneiras de obter uma propagação mais uniforme, como o hash baseado no valor de um número específico de bits da soma MD5 de cada nome de arquivo, mas vou ousar supor que isso seria um exagero para o que você está tentando realizar.

Sam Rodgers
fonte
1

Hmm, eu li este artigo recentemente . Essencialmente, você aproveita a distribuição do seu algoritmo de hash favorito. Comecei a tocar com os números, um INT assinado pelo MySQL tem um valor máximo de 2147483647. Você também pode variar o número desejado de arquivos por diretório e o número de subdiretórios para definir o número final de subdiretórios / arquivos- por diretório dividido para um determinado conjunto de dados, mas é difícil encontrar evidências empíricas sobre organizações ideais de diretório / arquivo. Este artigo fornece algumas dicas sobre as diferenças de desempenho nos sistemas de arquivos (algumas métricas interessantes), mas nada sobre as organizações ideais.

troca rápida
fonte
0

Eu acho que você está pensando muito nisso. Se você escolher um único nível adicional de diretórios e conseguir equilibrar as coisas de maneira uniforme, terá 1732 * diretórios e 1732 arquivos por diretório.

A menos que você planeje precisar de dezenas de bilhões de arquivos, poderá escolher um número entre 1000 e 100.000 e obter bons resultados.

* raiz quadrada de 3 milhões.

Eric Seppanen
fonte