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 cours d'exécution find | wc -l
).
Un petit pourcentage de fichiers est ajouté / supprimé / réécrit plusieurs fois par semaine. Ceci s’applique aux petits fichiers, ainsi qu’aux (petits) fichiers plus volumineux.
Les systèmes de fichiers que j'ai essayés (ext4, btrfs) ont quelques problèmes avec le positionnement des fichiers sur le disque. Sur une période plus longue, les positions physiques des fichiers sur le disque (média en rotation, pas disque à l'état solide) deviennent plus aléatoires. La conséquence négative de cette distribution aléatoire est que le système de fichiers devient plus lent (par exemple: 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 qui est capable de maintenir un profil de performances stable sur un support en rotation? Le système de fichiers peut fonctionner sur Fuse, mais il doit être fiable.
Réponses:
Performance
J'ai écrit un petit repère ( source ) pour savoir quel système de fichiers fonctionnait le mieux avec des centaines de milliers de petits fichiers:
supprimer tous les fichiers
synchroniser et supprimer le cache après chaque étape
Résultats (temps moyen en secondes, inférieur = meilleur):
Résultat:
alors qu'Ext4 affichait de bonnes performances globales, ReiserFS lisait extrêmement vite des 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
Le seul moyen d'empêcher les systèmes de fichiers de distribuer des fichiers sur le lecteur est de conserver la partition aussi grande que nécessaire, tout en veillant à ne pas la rendre trop petite pour éviter la fragmentation entre fichiers. Utiliser LVM peut être très utile.
Lectures complémentaires
Arch Wiki contient d'excellents articles sur les 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
la source
J'utilise ReiserFS pour cette tâche, il est spécialement conçu pour gérer beaucoup de petits fichiers. Il est facile de lire un texte à ce sujet sur le wiki funtoo.
la source
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 chez UCSC
la source
XFS est reconnu pour ses très bonnes performances dans des situations comme celle-ci. C'est en partie pourquoi nous l'utilisons dans mon travail pour nos magasins de courrier (pouvant contenir des centaines de milliers de fichiers dans un seul répertoire). Il a une meilleure tolérance aux pannes que ReiserFS, est utilisé beaucoup plus largement 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 différée qui entraîne au départ moins de fragmentation (vs autres systèmes de fichiers).
la source
syslogd
Modèle typique .) Par exemple, dans une configuration XFS sur MD que je viens d’observer, la suppression d’un fichier de 1,5 Go a pris 4,75 minutes (!) Alors que le lecteur de disque était limité à 100 transactions / s à un taux d’écriture de plus de 2 Mo / s. Cela a également un impact négatif sur les performances d'autres opérations d'E / S parallèles sur le même lecteur, car le lecteur est déjà saturé. Je n'ai jamais rien vu de tel dans d'autres FS (ou en train d'être testé dans des points de repère).