Linux Filesystems

2

Isso é em relação a uma pergunta que postei no StackOverflow:

link

Se você ler os comentários da resposta de Paul Alan Taylor, verá o que estou falando.

Aqui está a minha estrutura de pastas de exemplo:

A pasta principal contém 100.000 subpastas, cada uma contendo cerca de 20 arquivos. Minha pergunta é: terei problemas de desempenho ao solicitar um arquivo (por meio do navegador) no meu servidor da Web se estiver em um desses subdiretórios?

    
por zuk1 04.08.2009 / 13:21

7 respostas

11

Você está enfrentando um problema bem conhecido. Embora existam sistemas de arquivos que acomodem milhões de arquivos (XFS e ReiserFS no Linux e NTFS no Windows), eles ainda precisam vasculhar a pilha de nomes de arquivos que pesquisam esse arquivo. Só porque acomoda muitos arquivos não significa que será rápido. Eu solicitei propriedades de arquivo em um servidor Windows com apenas dezenas de milhares de arquivos, e esse foi praticamente um negócio de "ir almoçar e voltar". Eu também tentei obter um diretório listado via ls e descobri que os 20.000 arquivos estranhos nele requeriam cerca de 2 minutos de processamento em um servidor ocupado (o sistema de arquivos é o Ext3).

Felizmente, existe uma solução, embora possa ser um pouco diferente do que você espera.

Use subdiretórios adicionais.

Esta é uma estratégia bem conhecida e tem sido usada com sucesso em vários programas. Por exemplo, o Squid usa camadas de subdiretórios para lidar exatamente com o mesmo problema pelo mesmo motivo - centenas de milhares de arquivos que precisam ser acessados rapidamente. Usando apenas uma camada adicional de diretórios, eles podem gerenciar milhões com facilidade.

Também é muito mais comum em páginas da web que você esperaria. Toda vez que você vê uma URL semelhante a esta (negrito adicionado para ênfase):

link 09/08 / a4 /gibberish-page-key-abc123.html

... está realizando o mesmo efeito. Não se trata de rastrear artigos por ano e mês, trata-se de melhorar o desempenho de carregamento da página no cliente reduzindo o tempo que o servidor da Web gasta procurando pela página .

Se for possível, evite 100.000 arquivos por diretório. Tente apontar para 1.000 - 10.000. Se você não tiver certeza de como conseguir isso, apenas pegue a primeira letra do arquivo e torne-o um diretório adicional, por exemplo

http://mysite.com/subpage/abcdefg1234567.php

torna-se

http://mysite.com/subpage/a/abcdefg1234567.php

Se isso não reduzir a contagem de arquivos, você poderá usar a segunda ou a terceira letra, etc., até que a contagem de arquivos diminua para um tamanho gerenciável.

http://mysite.com/subpage/a/b/c/abcdefg1234567.php

Este processo requer um mínimo de codificação de sua parte, é facilmente acomodado pelos nomes de arquivos e irá melhorar seus tempos de acesso independentemente do sistema de arquivos que você usa . >     

por 04.08.2009 / 14:25
1

Do site da Novell:

Another way to overcome the limitation of 32000 subdirectories for the EXT3 file system is to increase the directories i-nodes maximum count to 65500 for the EXT3 kernel module, then recompile and build the new kernel from existing kernel sources. REF

Dito isso, use um banco de dados.

    
por 04.08.2009 / 13:33
1

Você precisa usar um sistema de arquivos que use algo como Árvore B + . Exemplos desses são XFS JFS . Note que nenhum sistema de arquivos é bom em armazenar arquivos como esse, você seria muito melhor usando um esquema de hashing se você controlasse o código que está sendo escrito no diretório.

    
por 04.08.2009 / 13:39
0

Depende do sistema de arquivos. O sistema de arquivos linux normal ext3 terá problemas com tantos arquivos. Se você tem muitos arquivos, provavelmente deveria dividi-los de alguma forma. Uma boa maneira é pegar o MD5SUM do arquivo, e pegar os 2 primeiros caracteres como um nome de diretório, depois os próximos 2, etc dependendo de quantos arquivos você tem.

    
por 04.08.2009 / 13:27
0

Você precisa dizer qual sistema de arquivos está usando. Eu li que o ext3 tem um máximo de 32.000 subdiretórios, então nem funcionará.

Por que você tem tantos sub-diretórios, talvez você deveria estar usando um banco de dados? Isso pode ser provável se eles forem muitos arquivos pequenos.

Eu acho que o sistema de arquivos correto pode ser uma preocupação secundária. Você pode querer voltar ao stackoverflow e ver qual seria a melhor estrutura de árvore (se uma árvore é ainda melhor) para o que você está fazendo. Em seguida, tente encontrar um sistema de arquivos ou banco de dados adequado. Embora faça sentido pensar sobre isso ao mesmo tempo, talvez você queira descobrir o aspecto da ciência da computação de grandes conjuntos de dados primeiro.

    
por 04.08.2009 / 13:27
0

Se for um sistema de armazenamento em cache, então muito ram é o caminho a percorrer. O Std linux armazenará em cache o acesso ao arquivo e a etapa lateral a quase todos os problemas do sistema de arquivos.

Se você vai abrir a pasta para qualquer coisa, então você precisa colocar as coisas em subpastas, já que qualquer pasta única com alguns milhares de arquivos levará tempo para ser carregada. As leituras de diretório geralmente não são armazenadas em cache pelo sistema.

    
por 04.08.2009 / 14:05
0

se você acessar os arquivos pelo nome de caminho exato, a perda de desempenho será menor, mas você não deve esquecer os diretórios, que são arquivos especiais . Toda vez que você lista um diretório ou pesquisa, você está analisando o arquivo. Nesse caso, você precisa distribuir a carga entre diferentes inodes. No seu caso, 120k dirs contendo 20 arquivos cada, é como se 2,4 milhões de arquivos estivessem sendo armazenados.

tendo a matemática simples, sqrt (120000 * 20) = 1549, então se você distribuir os arquivos entre ~ 1600 dirs e ~ 1600 arquivos em cada diretório, você otimizou as entradas de diretório em 98% + (1600 entradas em vez de 120k entradas), mas com a introdução de outros diretórios, essa otimização pode ser melhor.

sem ter mais informações sobre o seu sistema, isso é o que pode ser dito.

    
por 04.08.2009 / 18:44