¿La forma óptima de servir 70.000 archivos estáticos (jpg)?

¿La forma óptima de servir 70.000 archivos estáticos (jpg)?

Necesito entregar alrededor de 70.000 archivos estáticos (jpg) usando nginx. ¿Debo volcarlos todos en un solo directorio o hay una manera mejor (eficiente)? Como los nombres de los archivos son numéricos, consideré tener una estructura de directorios como:

xxx/xxxx/xxx

El sistema operativo es CentOS 5.1

Respuesta1

Punto de referencia, punto de referencia, punto de referencia! Probablemente encontrarásninguna diferencia significativaentre las dos opciones, lo que significa que es mejor dedicar su tiempo a otros problemas. Si realiza una evaluación comparativa y no encuentra una diferencia real, elija el esquema que sea más fácil: cuál es fácil de codificar si solo los programas tienen acceso a los archivos, o cuál es fácil de trabajar para los humanos si las personas necesitan trabajar frecuentemente con los archivos.

En cuanto a cuál es más rápido, creo que el tiempo de búsqueda en el directorio es proporcional al logaritmo del número de archivos en el directorio. Por lo tanto, cada una de las tres búsquedas de la estructura anidada será más rápida que una búsqueda grande, pero el total de las tres probablemente será mayor.

¡Pero no confíes en mí, no tengo ni idea de lo que estoy haciendo!Medida de rendimientocuando importa!

Respuesta2

Realmente depende del sistema de archivos que estés usando para almacenar los archivos.

Algunos sistemas de archivos (como ext2 y, en menor medida, ext3) son tremendamente lentos cuando tienes miles de archivos en un directorio, por lo que usar subdirectorios es una muy buena idea.

Otros sistemas de archivos, como XFS o reiserfs (*), no se ralentizan con miles de archivos en un directorio, por lo que no importa si tiene un directorio grande o muchos subdirectorios más pequeños.

(*) reiserfs tiene algunas características interesantes pero es un juguete experimental que tiene un historial de fallas catastróficas. no lo uses en nada ni siquiera remotamente importante.

Respuesta3

Como han dicho otros, es muy probable que el hash de directorio sea el más óptimo.

Sin embargo, lo que te sugeriría que hicieras es crear tus URIindependientede cualquier esquema de directorio que utilice, utilizando el módulo de reescritura de nginx, por ejemplo, asigne ejemplo.com/123456.jpg a /path/12/34/123456.jpg

Luego, si la estructura de su directorio necesita cambiar por razones de rendimiento, puede cambiarlo sin cambiar los URI publicados.

Respuesta4

Podrías poner un caché de calamar al frente en tu servidor nginx. Squid puede mantener las imágenes populares en la memoria o usar su propio diseño de archivos para búsquedas rápidas.

Para Squid, el valor predeterminado es 16 directorios de nivel uno y 256 de nivel dos. Estos son valores predeterminados razonables para mis sistemas de archivos.

Si no utiliza un producto como Squid y crea su propia estructura de archivos, necesitará crear un algoritmo hash razonable para sus archivos. Si los nombres de los archivos se generan aleatoriamente, esto es fácil y puede usar el nombre del archivo para dividirlo en depósitos. Si todos sus archivos se parecen a IMG_xxxx, entonces deberá usar los dígitos menos significativos o dividir el nombre del archivo en función de ese número hash.

información relacionada