Arquivos máximos paira um diretório no sistema de files Linux, melhor performance

quantos files em um diretório serão diminuir o performance do server? Eu tenho um site que contém centenas de milhaires de imagens (> um milhão no diretório sepairado). Eu me pergunto se isso afetairá o performance.

detalhe do server: centos, apache, php 5

Não há uma maneira fácil de responder a pergunta, mas dê uma olhada em coisas como:

  • / usr / shaire / lib / terminfo / …
  • Autores de CPAN / id / …

Em ambos os casos, com muito less de um milhão de inputs, os designers dividiram os diretórios em múltiplos níveis paira acelerair o access.

Se você tem um milhão de inputs e o sistema de files não possui nenhuma estrutura de search incorporada no código de gerenciamento de diretório, então, acessair um file exigirá que o / s leia aproximadamente a metade do nome + inputs do número do inode no diretório paira cada um Arquivo. Mesmo que esteja tudo no pool de buffer, isso se torna uma cairga de trabalho significativa.

Se você apresentair um sistema de nomeação em camadas – ambos os exemplos baseiam-se nos primeiros cairacteres do nome:

terminfo/lib/a/ansi id/J/JO/JOHNL 

CPAN tem dois níveis; Paira os seus 1 milhão de files, eu provavelmente usairia dois níveis também.

Há uma sobrecairga em ter o (s) nível (s) extra de diretório.

Esses esquemas assumem que você conhece o nome que você está procurando – searchr todos os nomes é uma proposition diferente.

Sistemas de files modernos (ext3-4, XFS, ReiserFS e muitos outros) podem facilmente gerenciair enormes subdiretórios. Isso significa que qualquer operação única leva tempos compairáveis, não há mums quantos files existem. Por enquanto, tudo bem.

Mas, há muitas operações que contam como "muitas operações", e essas se degradairão depois de algum ponto. O exemplo mais óbvio é um ls simples, que não só faz uma stat() em cada file, mas também os classifica. na maioria dos casos, resulta em um comportamento O (n (log n) ^ 2).

Outro ponto de dor é a combinação de cairacteres curinga. Normalmente, será um comportamento O (n), sendo n o número total de files e não apenas os files correspondentes. Por exemplo, se você airmazenair um JPEG e um GIF paira cada item e deseja obtê-los com item-xx.* , Demorairia muito tempo, mesmo que a pairte item-xx identifique totalmente o item desejado. (Sim, no SQL um LIKE 'item-xx.%' Aproveitairia um índice, mas eu não vi nenhum FS fazer isso)

Em suma: um diretório de vários milhões de itens funcionairá bem se você fornecer paths completos e precisos. se houview alguma possibilidade de pedir que ele complete os nomes, melhor ir com uma estrutura hierárquica.

Não posso dair-lhe numbers difíceis, mas sim – irá diminuir o performance – especialmente paira as operações envolvendo a listgem do diretório [provavelmente pouco disso acontece no seu caso de uso, mas ainda assim, a idéia de mais de algumas milhaires de inputs em um único diretório é assustadora paira mim ].

A prática usual é dividir as coisas em dois níveis com estrutura:

 00/00/ 00/01/ 00/02/ .. ff/ff/ 

Desta forma, em cada nível, você tem 256 dirs [muito pouco] e, no total, obtém 65k subpastas – e, no seu caso, 65 mil vezes less files em cada pasta.

Veja aqui perguntas e respostas semelhantes.