¿Cómo afecta la cantidad de archivos en la misma carpeta al rendimiento de E/S en un sistema de archivos ext4?

¿Cómo afecta la cantidad de archivos en la misma carpeta al rendimiento de E/S en un sistema de archivos ext4?

Estoy usandoGabinete de Kioto(una tienda de valores clave) para mi proyecto. El tipo específico de base de datos que estoy usando esDirDBque crea una gran cantidad de archivos en un directorio para almacenar los pares clave-valor. El servidor en el que estoy ejecutando este proyecto tiene un sistema de archivos ext4. El problema que encuentro es que la latencia de E/S aumenta a medida que aumenta la cantidad de archivos en el directorio. Además, cuando el directorio tiene demasiados archivos (digamos más de 1 millón de archivos), cuando intento eliminar toda la carpeta, tarda una eternidad (ya son más de 5 horas y sigue funcionando). ¿Alguien puede explicar por qué la latencia de E/S aumenta a medida que aumenta la cantidad de archivos y por qué rm tarda una eternidad en eliminar la carpeta?

Respuesta1

El ejemplo más simple de retrasos es que, obviamente, el tiempo para enumerar todo el directorio variará según el tamaño del directorio.

En segundo lugar, dependiendo de la configuración del sistema de archivos, ext4 utiliza listas enlazadas o un árbol b con hash para búsquedas en directorios. Sólo necesita buscar cómo funcionan esas dos estructuras de datos para tener una idea de las diferencias que podría generar una configuración incorrecta. La versión corta es que las listas enlazadas son bastante lentas y solo son adecuadas para directorios pequeños, mientras que los hashes son mucho más rápidos y se adaptan mucho mejor a directorios grandes.

Procesar una lista vinculada significa revisar todos y cada uno de los elementos de la lista porque, la mayoría de las veces, solo el elemento n-1 sabe dónde está el elemento n, por lo que primero debe leer el elemento n.

Procesar un árbol hash implica calcular un número en la memoria y saltar directamente a los detalles basándose en ese número. Aunque es posible que tenga que hacer esto varias veces para directorios grandes, es mucho más rápido que procesar cada nodo.

De todos modos, si realmente quieres entender los detalles, toda la documentación está disponible online. Podrías empezar aquí, por ejemplo:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories

información relacionada