Tengo un árbol de directorios que contiene muchos archivos pequeños y una pequeña cantidad de archivos más grandes. El tamaño promedio de un archivo es de aproximadamente 1 kilobyte. Hay 210158 archivos y directorios en el árbol (este número se obtuvo al ejecutar find | wc -l
).
Un pequeño porcentaje de archivos se agrega / elimina / reescribe varias veces por semana. Esto se aplica a los archivos pequeños, así como a (un pequeño número de) archivos más grandes.
Los sistemas de archivos que probé (ext4, btrfs) tienen algunos problemas con el posicionamiento de los archivos en el disco. Durante un período de tiempo más largo, las posiciones físicas de los archivos en el disco (medios rotativos, no discos de estado sólido) se están distribuyendo de manera más aleatoria. La consecuencia negativa de esta distribución aleatoria es que el sistema de archivos se está volviendo más lento (por ejemplo: 4 veces más lento que un sistema de archivos nuevo).
¿Existe un sistema de archivos de Linux (o un método de mantenimiento del sistema de archivos) que no sufra esta degradación del rendimiento y pueda mantener un perfil de rendimiento estable en un medio rotativo? El sistema de archivos puede ejecutarse en Fuse, pero debe ser confiable.
Respuestas:
Actuación
Escribí un pequeño Benchmark ( fuente ), para averiguar qué sistema de archivos funciona mejor con cientos de miles de archivos pequeños:
Borrar todos los archivos
sincronizar y soltar caché después de cada paso
Resultados (tiempo promedio en segundos, menor = mejor):
Resultado: si
bien Ext4 tuvo un buen rendimiento general, ReiserFS fue extremadamente rápido en la lectura de archivos secuenciales. Resultó que XFS es lento con muchos archivos pequeños; no debe usarlo para este caso de uso.
Problema de fragmentación
La única forma de evitar que los sistemas de archivos distribuyan archivos a través del disco es mantener la partición tan grande como realmente la necesite, pero preste atención para no hacer que la partición sea demasiado pequeña, para evitar la fragmentación de archivos internos. Usar LVM puede ser muy útil.
Otras lecturas
Arch Wiki tiene excelentes artículos relacionados con el rendimiento del sistema de archivos:
https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types
https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices
fuente
Estoy usando ReiserFS para esta tarea, está especialmente diseñado para manejar muchos archivos pequeños. Hay un texto fácil de leer al respecto en el wiki de funtoo.
fuente
El rendimiento ext4 disminuye después de 1-2 millones de archivos en un directorio. Vea esta página http://genomewiki.ucsc.edu/index.php/File_system_performance creado por Hiram Clawson en UCSC
fuente
XFS se destaca por desempeñarse muy bien en situaciones como esta. Esto es parte de por qué lo usamos en mi trabajo para nuestros almacenes de correo (que pueden contener cientos de miles de archivos en 1 directorio). Tiene mejor tolerancia a fallas que ReiserFS, se usa mucho más y generalmente es un sistema de archivos muy maduro.
Además, XFS admite la desfragmentación en línea. Aunque utiliza una técnica de asignación retrasada que resulta en una menor fragmentación (en comparación con otros sistemas de archivos) para empezar.
fuente
syslogd
patrón típico ). Por ejemplo, a mi lado en una configuración XFS sobre MD acabo de observar que eliminar un archivo de 1,5 GB tardó 4,75 minutos (!) Mientras la unidad de disco se limitó a un límite de 100 transacciones / s a una velocidad de escritura de más de 2 MB / s. Esto también afecta el rendimiento de otras operaciones de E / S paralelas en el mismo disco, ya que el disco ya está al máximo. Nunca vi algo así en otros FS (o ser probado en puntos de referencia).