Como armazenar e servir com mais eficiência mais de 1.000.000 de pequenos arquivos gziped em um servidor web Linux?

10

Eu tenho um grande conteúdo estático que tenho que fornecer por meio de um servidor da Web baseado em Linux. É um conjunto de mais de um milhão de pequenos arquivos gzip. 90% dos arquivos são menores que 1K e os arquivos restantes são no máximo 50K. No futuro, isso pode crescer para mais de 10 milhões de arquivos gzip.

Devo colocar este conteúdo em uma estrutura de arquivos ou devo considerar colocar todo esse conteúdo em um banco de dados? Se estiver em uma estrutura de arquivos, posso usar diretórios grandes ou devo considerar diretórios menores?

Foi-me dito que uma estrutura de arquivos seria mais rápida para a entrega, mas do outro lado, eu sei que os arquivos ocuparão muito espaço no disco, já que os blocos de arquivos terão mais de 1K.

Qual é a melhor estratégia em relação ao desempenho de entrega?

UPDATE

Para os registros, realizei um teste no Windows 7, com meio milhão de arquivos:

    
por Jérôme Verstrynge 04.03.2012 / 21:16

4 respostas

6

Eu diria que uma estrutura FS seria mais rápida, mas você precisará de uma boa estrutura de diretórios para evitar diretórios com um grande número de arquivos.

Eu não me preocuparia muito com o espaço em disco perdido. Como exemplo, com 16K de tamanho de bloco, você perderá 15GB de espaço no pior caso, onde você precisa de um bloco adicional para cada arquivo. Com os tamanhos dos discos atuais, isso não é nada e você pode adaptar os parâmetros do seu sistema de arquivos para sua necessidade específica.

    
por 04.03.2012 / 21:27
5

Se você escolher a opção de estrutura de arquivos, uma coisa que você pode fazer para melhorar o desempenho do disco I / O, pelo menos até certo ponto, é montar a partição com noatime + nodiratime, a menos que você precise deles. Eles não são realmente importantes, então eu recomendo fazer isso. Talvez você também possa usar uma unidade de estado sólido.

    
por 05.03.2012 / 18:05
4

Acho que a resposta correta aqui depende de como os arquivos serão indexados ... o que determina quando um determinado arquivo é selecionado para entrega.

Se você já está fazendo uma consulta ao banco de dados para determinar o nome do arquivo, pode muito bem achar melhor manter o arquivo ali mesmo no registro db, você pode encontrar os melhores resultados de ajustes em algumas configurações de paginação. seu banco de dados de escolha e, em seguida, armazenar os arquivos no banco de dados (ex: páginas maiores para contabilizar todos os registros blob), ou você pode achar que ainda é melhor usar o sistema de arquivos.

A opção de banco de dados tem uma chance um pouco maior de funcionar porque, com um milhão de registros, é provável que cada arquivo não tenha a mesma probabilidade de ser consultado. Se você estiver em uma situação em que um arquivo pode ser consultado várias vezes seguidas, ou quase em sequência, o banco de dados pode atuar como um cache de fato para arquivos recuperados recentemente; nesse caso, você geralmente terá o resultado do arquivo já carregado na memória. Talvez seja necessário ajustar cuidadosamente os componentes internos do seu mecanismo de banco de dados para obter o comportamento desejado.

Mas o principal a tirar da minha resposta é que você realmente não sabe o que funcionará melhor até que você experimente com alguns dados de teste representativos e meça os resultados.

    
por 05.03.2012 / 18:18
1

Com sistemas de arquivos modernos, isso não deve ser um grande problema. Eu testei o XFS com 1 bilhão de arquivos no mesmo diretório, e tenho certeza que o ext4 também irá funcionar bem (contanto que o sistema de arquivos em si não seja muito grande). Tenha memória suficiente para armazenar em cache as entradas do diretório; cache maior do processador ajudará muito também.

    
por 04.03.2012 / 21:40