Arquivos máximos para um diretório no sistema de arquivos Linux, melhor desempenho

1

quantos arquivos em um diretory diminuirão o desempenho do servidor? Eu tenho um site que contém centenas de milhares de imagens (> um milhão no diretório separado). Gostaria de saber se isso afetará o desempenho.

detalhes do servidor: centos, apache, php 5

    
por ngkong 08.05.2010 / 18:22

3 respostas

2

Não há uma maneira fácil de responder à pergunta, mas veja algumas coisas como:

  • / usr / share / lib / terminfo /...
  • autores do CPAN / id /...

Em ambos os casos, com muito menos de um milhão de entradas, os projetistas dividem os diretórios em vários níveis para acelerar o acesso.

Se você tiver um milhão de entradas e o sistema de arquivos não tiver nenhuma estrutura de busca incorporada no código de manipulação de diretório, o acesso a um arquivo exigirá que o / s leia cerca de metade do nome + entradas do número inode no diretório. diretório para cada arquivo. Mesmo que esteja tudo no buffer pool, isso se torna uma carga de trabalho significativa.

Se você introduzir um sistema de nomes em camadas - os dois exemplos baseiam-se nos primeiros caracteres do nome:

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

O CPAN tem dois níveis; para seus 1 milhão de arquivos, provavelmente usaria dois níveis também.

Existe alguma sobrecarga em ter o (s) nível (s) extra (s) de diretório.

Esses esquemas assumem que você sabe o nome que procura - pesquisar todos os nomes é uma proposta diferente.

    
por 08.05.2010 / 18:32
1

sistemas de arquivos modernos (ext3-4, XFS, ReiserFS e muitos outros) podem lidar facilmente com subdiretórios enormes. Isso significa que qualquer operação única leva tempos comparáveis, não importa quantos arquivos existem. até agora, tudo bem.

Mas há muitas operações que contam como 'muitas operações', e elas serão degradadas depois de algum ponto. O exemplo mais óbvio é um simples ls , que não só faz um stat() em cada arquivo, mas também os ordena. na maioria dos casos, resulta em um comportamento O (n (log n) ^ 2).

Outro ponto de dor é a correspondência de caractere curinga. Geralmente, será um comportamento O (n), sendo n o número total de arquivos e não apenas os arquivos correspondentes. Por exemplo, se você armazena um JPEG e um GIF para cada item e deseja obtê-los com item-xx.* , levaria muito tempo, mesmo que a parte item-xx identifique totalmente o item desejado. (Sim, no SQL, um LIKE 'item-xx.%' tiraria proveito de um índice; mas eu não vi nenhum FS fazer isso)

Resumindo: um diretório de vários milhões de itens terá um bom desempenho se você der caminhos completos e precisos. se houver alguma possibilidade de pedir para completar os nomes, é melhor ir com uma estrutura hierárquica.

    
por 09.05.2010 / 04:11
0

não posso fornecer números concretos, mas sim - isso diminuirá o desempenho - especialmente para operações que envolvam listar o diretório [provavelmente pouco disso acontece no seu caso de uso, mas ainda assim, a idéia de mais do que alguns milhares de entradas no diretório único é assustador para 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 menos arquivos em cada pasta.

veja aqui pergunta e resposta.

    
por 08.05.2010 / 18:39