Por que não deve haver muitos arquivos em um diretório que atenda apenas a solicitações estáticas da web?

1

Esta pode ser uma pergunta muito geral, mas eu realmente gosto de encontrar algumas respostas ou pistas detalhadas.

Estou discutindo isso com um amigo, tentando convencê-lo a colocar mais de 300.000 arquivos de uma única pasta em mais de um (como 1000 por subdiretório). Esses arquivos são imagens e devem ser exibidos on-line, como:

www.example.com/folder/1.png
.
.
.
www.example.com/folder/300000.png

Eu simplesmente lembro de muitos anos atrás quando trabalhei em uma empresa de serviços de vídeos on-line como o Youtube. Colocamos as capturas de tela em uma pasta e, em seguida, o servidor sempre falhava. Naquela época, um "boato" dizia que as pessoas não deveriam colocar muitos arquivos em uma pasta, mas não sabemos o motivo detalhado.

Quantos arquivos devo colocar em uma pasta? Se houver uma limitação, por quê? Quaisquer formas recomendadas para projetar isso?

As informações do meu servidor:

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.8 (wheezy)
Release:    7.8
Codename:   wheezy

Versão do Core Build:

Linux linode 4.1.5-x86_64-linode61 #7 SMP Mon Aug 24 13:46:31 EDT 2015 x86_64 GNU/Linux

Eu acho que este caso se aplica a muitos tipos diferentes de software de servidor.

    
por AGamePlayer 17.11.2015 / 03:25

3 respostas

5

Este não é realmente um grande problema com sistemas de arquivos mais recentes como XFS e ext4, mas em sistemas de arquivos mais antigos ou mal configurados pode ser um problema sério.

Com sistemas de arquivos Linux mais antigos, como o ext3, um diretório é apenas uma lista de arquivos não ordenada .

A desordem é importante, porque significa que a única maneira de o sistema localizar um arquivo em um diretório é pesquisá-lo do começo ao fim.

Se um diretório contiver 3.000 arquivos, será necessária uma média de 1.500 comparações para localizar um arquivo aleatório no diretório. Mas se o diretório contiver 300.000 arquivos, será necessária uma média de 150.000 comparações para encontrar um arquivo aleatório nesse diretório.

Em ambos os casos, se a entrada de diretório já não estiver armazenada em cache na RAM, ela deverá ser carregada do disco, o que adicionaria uma quantidade significativa de tempo ao acesso ao arquivo, proporcional ao tamanho do diretório. Obviamente, um pequeno dentry pode ser carregado mais rápido que um grande.

Assim, é muito mais rápido quando você usa uma estrutura de diretórios mais hierárquica para separar grandes números de arquivos em diretórios exclusivos.

O XFS não sofre com esse problema, pois usa uma tabela de hash para entradas de diretório de pesquisa. Assim, ele pode manipular um diretório com centenas de milhares de arquivos quase tão facilmente quanto um diretório com um arquivo. Mas ainda tem a penalidade de precisar carregar a estrutura de dados maior do disco. Se você tem RAM suficiente no sistema, isso não é realmente um problema prático.

O Ext4 também usa um índice de diretório hash.

    
por 17.11.2015 / 04:06
2

Muitos sistemas de arquivos ficam mais lentos quando um único diretório contém muitos (dezenas ou centenas de milhares ou milhões de) arquivos ou subdiretórios em um único diretório e pode até haver um limite superior rígido também, mas se e por quanto depende do sistema de arquivos escolhido e das operações de IO. Verifique a Wikipedia para uma comparação dos recursos do sistema de arquivos .

Obviamente listar e classificar um diretório com muitos arquivos será mais custoso, mas até mesmo recuperar um arquivo pelo nome pode se tornar mais caro com diretórios maiores.

Uma solução comum é criar uma estrutura de subdiretório de vários níveis baseada ou derivada do nome do arquivo .

    
por 17.11.2015 / 04:17
0

O quanto isso é importante depende do sistema de arquivos usado e, às vezes, de outros aspectos de como o armazenamento é implementado. Pode também depender do padrão de uso.

O desempenho de alguns sistemas de arquivos mais antigos costumava se degradar muito quando o número de arquivos ultrapassava 1000 ou mais. Isso é menos verdadeiro em relação aos sistemas de arquivos mais recentes, mas não é um problema não completo.

Com um grande número de arquivos, o nó do diretório ficará grande. Isso precisa ser reescrito toda vez que mudar. Isso pode ser uma preocupação de desempenho.

Se o seu armazenamento estiver em rede, o bloqueio associado à gravação no diretório poderá se tornar um problema. Por exemplo. se você tiver um cluster de servidores da Web compartilhando um diretório grande para armazenar arquivos de sessão que são alterados em cada ocorrência da Web, provavelmente terá um desempenho muito ruim, essencialmente serializando o acesso conforme os processos aguardam o bloqueio do nó do diretório. Hashing os arquivos da sessão em diretórios menores significa que a maioria dos acessos a arquivos de sessão não terá em uma determinada sessão de gravação que requer bloqueio.

    
por 17.11.2015 / 04:52