web-dev-qa-db-fra.com

Quel est le système de fichiers Linux le plus performant pour stocker un grand nombre de petits fichiers (disque dur, pas SSD)?

J'ai une arborescence de répertoires qui contient de nombreux petits fichiers et un petit nombre de fichiers plus volumineux. La taille moyenne d'un fichier est d'environ 1 kilo-octet. Il y a 210158 fichiers et répertoires dans l'arborescence (ce nombre a été obtenu en exécutant find | wc -l).

Un petit pourcentage de fichiers est ajouté/supprimé/réécrit plusieurs fois par semaine. Cela s'applique aux petits fichiers, ainsi qu'au (petit nombre de) fichiers plus gros.

Les systèmes de fichiers que j'ai essayés (ext4, btrfs) ont des problèmes avec le positionnement des fichiers sur le disque. Sur une plus longue période de temps, les positions physiques des fichiers sur le disque (support rotatif, pas disque SSD) sont de plus en plus distribuées de façon aléatoire. La conséquence négative de cette distribution aléatoire est que le système de fichiers devient plus lent (comme: 4 fois plus lent qu'un nouveau système de fichiers).

Existe-t-il un système de fichiers Linux (ou une méthode de maintenance du système de fichiers) qui ne souffre pas de cette dégradation des performances et est capable de maintenir un profil de performances stable sur un support rotatif? Le système de fichiers peut fonctionner sur Fuse, mais il doit être fiable.

46
user14159

Performance

J'ai écrit un petit Benchmark ( source ), pour savoir quel système de fichiers fonctionne le mieux avec des centaines de milliers de petits fichiers:

  • créer 300000 fichiers (512B à 1536B) avec les données de/dev/urandom
  • réécrire 30000 fichiers aléatoires et changer la taille
  • lire 30000 fichiers séquentiels
  • lire 30000 fichiers aléatoires
  • supprimer tous les fichiers

  • synchroniser et supprimer le cache après chaque étape

Résultats (temps moyen en secondes, inférieur = meilleur):

Using Linux Kernel version 3.1.7
Btrfs:
    create:    53 s
    rewrite:    6 s
    read sq:    4 s
    read rn:  312 s
    delete:   373 s

ext4:
    create:    46 s
    rewrite:   18 s
    read sq:   29 s
    read rn:  272 s
    delete:    12 s

ReiserFS:
    create:    62 s
    rewrite:  321 s
    read sq:    6 s
    read rn:  246 s
    delete:    41 s

XFS:
    create:    68 s
    rewrite:  430 s
    read sq:   37 s
    read rn:  367 s
    delete:    36 s

Résultat:
Alors qu'Ext4 avait de bonnes performances globales, ReiserFS était extrêmement rapide pour lire les fichiers séquentiels. Il s'est avéré que XFS est lent avec de nombreux petits fichiers - vous ne devriez pas l'utiliser pour ce cas d'utilisation.

Problème de fragmentation

La seule façon d'empêcher les systèmes de fichiers de distribuer des fichiers sur le lecteur est de garder la partition aussi grande que vous en avez vraiment besoin, mais faites attention à ne pas la rendre trop petite, pour éviter la fragmentation intra-fichier. L'utilisation de LVM peut être très utile.

Lectures complémentaires

L'Arch Wiki contient d'excellents articles traitant des performances du système de fichiers:

https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types

https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices

49
taffer

J'utilise ReiserFS pour cette tâche, il est spécialement conçu pour gérer un grand nombre de petits fichiers. Il y a un moyen facile lire le texte à ce sujet sur le wiki funtoo.

ReiserFS dispose également d'une multitude de fonctionnalités visant spécifiquement à améliorer les performances des petits fichiers. Contrairement à ext2, ReiserFS n'alloue pas d'espace de stockage dans des blocs fixes d'un ou quatre k. Au lieu de cela, il peut allouer la taille exacte dont il a besoin.

7
Baarn

Les performances ext4 chutent après 1 à 2 millions de fichiers dans un répertoire. Voir cette page http://genomewiki.ucsc.edu/index.php/File_system_performance créé par Hiram Clawson à UCSC

7
Max

XFS est réputé pour fonctionner très bien dans des situations comme celle-ci. C'est en partie pourquoi nous l'utilisons à mon travail pour nos magasins de courrier (qui peuvent contenir des centaines de milliers de fichiers dans 1 répertoire). Il a une meilleure tolérance aux pannes que ReiserFS, est beaucoup plus utilisé et est généralement un système de fichiers très mature.

De plus, XFS prend en charge la défragmentation en ligne. Bien qu'il utilise une technique d'allocation retardée qui se traduit par moins de fragmentation (par rapport aux autres systèmes de fichiers) pour commencer.

0
Patrick