Maneira ideal de servir 70.000 arquivos estáticos (jpg)?

Maneira ideal de servir 70.000 arquivos estáticos (jpg)?

Preciso servir cerca de 70.000 arquivos estáticos (jpg) usando nginx. Devo despejar todos eles em um único diretório ou existe uma maneira melhor (eficiente)? Como os nomes dos arquivos são numéricos, considerei ter uma estrutura de diretórios como:

xxx/xxxx/xxx

O sistema operacional é CentOS 5.1

Responder1

Referência, referência, referência! Você provavelmente encontraránenhuma diferença significativaentre as duas opções, o que significa que seu tempo será melhor gasto em outros problemas. Se você fizer um benchmark e não encontrar nenhuma diferença real, escolha o esquema que for mais fácil - o que é fácil de codificar se apenas os programas tiverem que acessar os arquivos ou o que é fácil para os humanos trabalharem se as pessoas precisarem trabalhar frequentemente com os arquivos.

Quanto ao que for mais rápido, acredito que o tempo de pesquisa do diretório seja proporcional ao logaritmo do número de arquivos no diretório. Portanto, cada uma das três pesquisas para a estrutura aninhada será mais rápida do que uma grande pesquisa, mas o total das três provavelmente será maior.

Mas não confie em mim, não tenho ideia do que estou fazendo!Medir o desempenhoquando importa!

Responder2

realmente depende do sistema de arquivos que você está usando para armazenar os arquivos.

alguns sistemas de arquivos (como ext2 e, em menor extensão, ext3) são terrivelmente lentos quando você tem milhares de arquivos em um diretório, portanto, usar subdiretórios é uma ideia muito boa.

outros sistemas de arquivos, como XFS ou reiserfs(*), não ficam lentos com milhares de arquivos em um diretório, então não importa se você tem um diretório grande ou vários subdiretórios menores.

(*) reiserfs tem alguns recursos interessantes, mas é um brinquedo experimental que tem um histórico de falhas catastróficas. não o use em nada remotamente importante.

Responder3

Como já foi dito, o hash de diretório provavelmente será o ideal.

O que eu sugiro que você faça é criar seus URIsindependentede qualquer esquema de diretório que você usar, usando o módulo de reescrita do nginx, por exemplo, mapeie example.com/123456.jpg para /path/12/34/123456.jpg

Então, se sua estrutura de diretório precisar ser alterada por motivos de desempenho, você poderá alterar isso sem alterar seus URIs publicados.

Responder4

Você pode colocar um cache do squid na frente do seu servidor nginx. O Squid pode manter as imagens populares na memória ou usar seu próprio layout de arquivo para pesquisas rápidas.

Para o Squid, o padrão é 16 diretórios de nível um e 256 diretórios de nível dois. Esses são padrões razoáveis ​​para meus sistemas de arquivos.

Se você não usa um produto como o Squid e cria sua própria estrutura de arquivos, precisará criar um algoritmo de hash razoável para seus arquivos. Se os nomes dos arquivos forem gerados aleatoriamente, isso será fácil e você poderá usar o próprio nome do arquivo para dividi-los em grupos. Se todos os seus arquivos se parecerem com IMG_xxxx, você precisará usar os dígitos menos significativos ou fazer o hash do nome do arquivo e dividir com base nesse número de hash.

informação relacionada