Qual é o “custo” de pastas profundamente aninhadas no ext4?

6

Eu estava encontrando problemas de desempenho com centenas de milhares de arquivos em diretórios únicos quando precisei fazer certas correspondências curinga. Do ponto de vista dos meus aplicativos, uma solução simples é colocar os arquivos em pastas profundamente aninhadas.

O limite superior esperado para o número total de pastas em toda a hierarquia é 9 ^ 30. Pode-se supor que esse limite nunca será atingido (veja o comentário abaixo). O número de pastas simplesmente crescerá à medida que os arquivos forem adicionados.

Pergunta: Existe alguma implicação na perspectiva do sistema de arquivos, quando grandes quantidades de pastas são criadas em um sistema de arquivos ext4? Quanto espaço é consumido por ex. uma pasta contendo apenas outra pasta? Terei problemas por causa de muitos metadados?

(Há certas vantagens da perspectiva dos meus aplicativos com estrutura acima comparada a, por exemplo, pastas baseadas em hash em uma hierarquia mais simples, estou ciente de métodos "melhores" para organizar dados)

    
por Martin 04.06.2013 / 14:00

2 respostas

5

Cada pasta consome um inode (256 bytes) e pelo menos um bloco (provavelmente 4096 bytes). O maior problema pode ser o tempo de acesso em várias camadas da hierarquia.

O problema de desempenho provavelmente não é devido ao tamanho da pasta, mas à expansão do nome do caminho. A expansão do nome do caminho tem dois problemas:

  1. Classifica os resultados (que não podem ser desabilitados), o que leva um tempo assustadoramente longo para grandes quantidades de itens.
  2. Cria linhas de comando ilegais (dependendo do tipo de uso) (muitos itens).

Você deve abordar isso no nível do aplicativo. Leia 100 nomes de arquivos por vez (sem classificação, com find ou ls -U ) e classifique esses pequenos grupos, se necessário. Isso também permite a leitura paralela do uso do disco e da CPU.

Se você realmente precisar da expansão e / ou classificação do nome do caminho, poderá acelerar bastante o processo (se os arquivos forem alterados raramente) adicionando os arquivos aos diretórios (vazios) em ordem de classificação.

    
por 04.06.2013 / 14:36
7

O Ext4 lida um pouco melhor em diretórios grandes do que nas versões anteriores, mas ainda ocupa depois de 10.000 arquivos no mesmo diretório. Separar arquivos em uma hierarquia de diretórios a alguns níveis de profundidade é uma solução comum para manter o desempenho. Cada incremento de profundidade requer uma indireção extra ao procurar um arquivo, mas a largura aumenta exponencialmente com a profundidade.

Por exemplo, se os arquivos tiverem nomes consistindo apenas de letras, dígitos e alguns sinais de pontuação, em vez de colocá-los todos no mesmo diretório, crie subdiretórios com base nos dois primeiros caracteres do nome do arquivo. Ou seja, o arquivo foobar é armazenado em fo/foobar . Se você ainda tiver muitos arquivos nos subdiretórios, aumente a profundidade: fo/ob/foobar e assim por diante. Você terá que fazer benchmarks para descobrir quantos personagens dividir depois e com que profundidade parar.

Existem muitos diretórios potenciais, e a maioria terminará vazia. Portanto, em vez de criar todos os diretórios no início, crie-os sob demanda. Por exemplo, se você precisar criar o arquivo foobar , crie o diretório fo , se ele ainda não existir, faça o mesmo para fo/ba e, em seguida, armazene foobar em fo/ba/foobar . / p>

A menos que os arquivos sejam pequenos (menos de 4kB), os diretórios representarão uma quantidade insignificante de espaço. Mesmo com arquivos minúsculos, desde que você não exagere na profundidade, haverá muito menos diretórios do que arquivos. No entanto, se você tiver um grande número de arquivos minúsculos, é um sinal de que você deve estar usando um banco de dados.

    
por 05.06.2013 / 02:58