¿Cómo almaceno y sirvo más de 1,000,000 de pequeños archivos gziped en un servidor web Linux?

10

Tengo un gran contenido estático que tengo que entregar a través de un servidor web basado en Linux. Es un conjunto de más de un millón de pequeños archivos gzip. El 90% de los archivos tienen menos de 1K y los archivos restantes tienen como máximo 50K. En el futuro, esto podría crecer a más de 10 millones de archivos gzip.

¿Debo poner este contenido en una estructura de archivos o debería considerar poner todo este contenido en una base de datos? Si está en una estructura de archivos, ¿puedo usar directorios grandes o debería considerar directorios más pequeños?

Me dijeron que una estructura de archivos sería más rápida para la entrega, pero por otro lado, sé que los archivos ocuparán mucho espacio en el disco, ya que los bloques de archivos serán más de 1K.

¿Cuál es la mejor estrategia con respecto al rendimiento de entrega?

ACTUALIZAR

Para los registros, he realizado una prueba en Windows 7, con medio millón de archivos:

ingrese la descripción de la imagen aquí

Jérôme Verstrynge
fuente

Respuestas:

6

Supongo que una estructura FS sería más rápida, pero necesitará una buena estructura de directorios para evitar tener directorios con una gran cantidad de archivos.

No me preocuparía demasiado por la pérdida de espacio en disco. Como ejemplo, con un tamaño de bloque de 16K, perderá 15GB de espacio en el peor de los casos donde necesita un bloque adicional para cada archivo. Con los tamaños de disco actuales, eso no es nada y puede adaptar los parámetros de su sistema de archivos a sus necesidades específicas.

Sven
fuente
5

Si elige la opción de estructura de archivo, una cosa que puede hacer para mejorar el rendimiento de E / S del disco, al menos en cierto grado, es montar la partición con noatime + nodiratime a menos que deba tenerlos. No son realmente importantes, así que recomiendo hacerlo. Quizás también pueda usar una unidad de estado sólido.

oda
fuente
4

Creo que la respuesta correcta aquí depende de cómo se indexarán los archivos ... lo que determina cuándo se selecciona un archivo determinado para su entrega.

Si ya está haciendo una consulta en la base de datos para determinar su nombre de archivo, es muy posible que sea mejor que mantenga el archivo allí mismo en el registro de db, puede encontrar los mejores resultados al ajustar algunas configuraciones de paginación en su base de datos de elija y luego almacene los archivos en la base de datos (p. ej., páginas más grandes para tener en cuenta todos los registros de blobs), o puede descubrir que todavía es mejor usar el sistema de archivos.

La opción de base de datos tiene un poco más de posibilidades de funcionar porque, con un millón de registros, es probable que no sea igualmente probable consultar cada archivo. Si se encuentra en una situación en la que se puede consultar un archivo varias veces seguidas, o casi en una fila, la base de datos puede actuar como un caché de facto para los archivos recuperados recientemente, en cuyo caso a menudo obtendrá el resultado del archivo Ya cargado en la memoria. Es posible que deba ajustar cuidadosamente las partes internas de su motor de base de datos para obtener el comportamiento que desea.

Pero lo principal que debo sacar de mi respuesta es que realmente no sabes qué funcionará mejor hasta que lo pruebes con algunos datos de prueba representativos y midas los resultados.

Joel Coel
fuente
1

Con los sistemas de archivos modernos no debería ser un gran problema. He probado XFS con mil millones de archivos en el mismo directorio, y estoy bastante seguro de que ext4 también funcionará bien (siempre que el sistema de archivos en sí no sea demasiado grande). Tener suficiente memoria para almacenar en caché las entradas del directorio; un caché de procesador más grande también ayudará mucho.

wazoox
fuente
2
Los sistemas de archivos EXT no están lidiando muy bien con un alto conteo de archivos en el mismo directorio; especialmente no con la configuración predeterminada de index_directorio. No probé XFS con un conteo de archivos tan alto en el mismo directorio, pero estoy bastante seguro de que EXT no funcionará con nada remotamente cercano a mil millones en el mismo directorio.
Hrvoje Špoljar
1
Escuché que reiserfs es bueno para archivos pequeños, pero también escuché que el tipo que mantiene el software está en prisión (!) Por lo que el futuro cercano de reiserfs es bastante incierto. Yo personalmente elegiría EXT4 y XFS como segunda opción. ¿No es XFS el mejor para archivos grandes?
öde
Solía ​​serlo, pero si está ejecutando un kernel nuevo (3.0 y superior) también funciona bien para archivos pequeños.
wazoox