¿Número máximo de archivos en un directorio ext3 sin dejar de obtener un rendimiento aceptable?

25

Tengo una aplicación que escribe en un directorio ext3 que con el tiempo ha crecido a aproximadamente tres millones de archivos. No hace falta decir que leer la lista de archivos de este directorio es insoportablemente lento.

No culpo a ext3. La solución adecuada hubiera sido dejar que el código de la aplicación escribiera en subdirectorios, como en ./a/b/c/abc.extlugar de usar solo ./abc.ext.

Estoy cambiando a esa estructura de subdirectorio y mi pregunta es sencilla: ¿aproximadamente cuántos archivos debo esperar almacenar en un directorio ext3 mientras sigo obteniendo un rendimiento aceptable? Cual es tu experiencia

O en otras palabras; suponiendo que necesito almacenar tres millones de archivos en la estructura, ¿cuántos niveles de profundidad debería tener la ./a/b/c/abc.extestructura?

Obviamente, esta es una pregunta que no se puede responder exactamente, pero estoy buscando una estimación del parque de pelota.

knorv
fuente

Respuestas:

12

Siempre que tenga una distribución que admita la dir_indexcapacidad, puede tener fácilmente 200,000 archivos en un solo directorio. Sin embargo, lo mantendría a unos 25,000, solo para estar seguro. Sin dir_index, trate de mantenerlo en 5,000.

Ignacio Vazquez-Abrams
fuente
10

Tenga MUCHO cuidado al seleccionar la división del directorio. "a / b / c" me suena como una receta para el desastre ...

No vaya ciegamente a hacer una estructura profunda de varios directorios, digamos 100 entradas en el primer nivel, 100 entradas en el segundo nivel, 100 entradas en el tercero. He estado allí, hice eso, obtuve la chaqueta y tuve que reestructurarla cuando el rendimiento se fue a la basura con unos pocos millones de archivos. :-)

Tenemos un cliente que hizo el diseño de "directorios múltiples", y termina poniendo solo uno a cinco archivos por directorio, y esto los estaba matando. 3 a 6 horas para hacer un "du" en esta estructura de directorios. El salvador aquí fue SSD, no estaban dispuestos a reescribir esta parte de su aplicación, y un SSD redujo este tiempo de horas a minutos.

El problema es que cada nivel de búsquedas en el directorio toma búsquedas, y las búsquedas son extremadamente caras. El tamaño del directorio también es un factor, por lo que tenerlo es más pequeño que grande es una gran victoria.

Para responder a su pregunta sobre cuántos archivos por directorio, 1,000 de los que he oído hablar son "óptimos", pero el rendimiento en 10,000 parece estar bien.

Entonces, lo que recomendaría es un nivel de directorios, cada nivel es un directorio de 2 caracteres de largo, compuesto por letras mayúsculas y minúsculas y los dígitos, para alrededor de 3800 directorios en el nivel superior. Luego puede almacenar archivos de 14M con esos subdirectorios que contienen 3800 archivos, o alrededor de 1,000 archivos por subdirectorio para archivos de 3M.

He hecho un cambio como este para otro cliente, y marcó una gran diferencia.

Sean Reifschneider
fuente
6

Le sugiero que pruebe probar varios tamaños de directorio con una herramienta de evaluación comparativa, como el matasellos , porque hay muchas variables como el tamaño de caché (tanto en el sistema operativo como en el subsistema de disco) que dependen de su entorno particular.

Mi regla general es apuntar a un tamaño de directorio de <= 20k archivos, aunque he visto un rendimiento relativamente decente con hasta 100k archivos / directorio.

David Gelhar
fuente
3

Tengo todos los archivos van carpetas como:

cargas / [fecha] / [hora] /yo.png

y no tengo ningún problema de rendimiento.

Amy B
fuente
44
¿Y cuántos archivos obtienes por hora?
Cascabel
2

Puedo confirmar en un servidor bastante potente con mucha memoria bajo una carga decente que 70,000 archivos pueden causar todo tipo de estragos. Fui a eliminar una carpeta de caché con 70k archivos y causó que apache comenzara a generar nuevas instancias hasta que alcanzó un máximo de 255 y el sistema usó toda la memoria libre (16 gb, aunque la instancia virtual puede haber sido menor). De cualquier manera, mantenerlo por debajo de 25,000 es probablemente un movimiento muy prudente

jriskin
fuente
1

En mi experiencia, el mejor enfoque es no sobre-diseñar la estructura del archivo de antemano. Como se menciona en al menos otra respuesta, hay extensiones del sistema de archivos que se ocupan del problema de rendimiento.

El problema que he encontrado con más frecuencia es la usabilidad en el aspecto administrativo. La cantidad mínima de trabajo que puede hacer para disminuir la cantidad de archivos en un directorio es probablemente el enfoque que necesita en este momento.

sqrt (3_000_000) == 1732

Un par de miles de archivos en un solo directorio me parece razonable. Sé tu propio juez para tu propia situación. Para lograr esto, intente dividir los archivos en un solo nivel de directorios hash para que el número promedio de archivos por directorio sea aproximadamente el mismo que el número de directorios.

Dada su ejemplo, esto sería ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

La difusión de los archivos dependerá en gran medida de los nombres de archivo reales. Imagine que aplica esta técnica a un directorio de un millón de archivos cada uno nombrado foobar???.txt. Hay formas de lograr una distribución más uniforme, como el hash basado en el valor de un número particular de bits de la suma MD5 de cada nombre de archivo, pero me atreveré a adivinar que sería excesivo para lo que está tratando de lograr.

Sam Rodgers
fuente
1

Hmm, leí este artículo recientemente . Esencialmente, usted aprovecha la distribución de su algoritmo de hash favorito. Empecé a jugar con los números, un INT firmado con MySQL tiene un valor máximo de 2147483647. También puede variar el número deseado de archivos por directorio y el número de subdirectorios para establecer el número final de subdirectorios / archivos. división por directorio para un conjunto de datos dado, pero es difícil encontrar evidencia empírica sobre organizaciones óptimas de directorio / archivo. Este artículo da una idea de las diferencias de rendimiento entre los sistemas de archivos (algunas métricas interesantes), pero nada sobre las organizaciones óptimas.

quickshiftin
fuente
0

Creo que estás pensando demasiado en esto. Si incluso eligió un solo nivel adicional de directorios y pudo equilibrar las cosas de manera uniforme, tendría 1732 * directorios y 1732 archivos por directorio.

A menos que planee necesitar decenas de miles de millones de archivos, podría elegir un número entre 1000 y 100,000 y obtener buenos resultados.

* raíz cuadrada de 3 millones.

Eric Seppanen
fuente