J'ai une application écrivant à un répertoire ext3 qui au fil du temps est devenu environ trois millions de fichiers. Inutile de dire que la lecture de la liste de fichiers de ce répertoire est insupportablement lente.
Je ne blâme pas ext3. La solution appropriée aurait été de laisser le code d'application écrire à des sous-répertoires telles que ./a/b/c/abc.ext
plutôt que d'utiliser seulement ./abc.ext
.
Je passe à une telle structure sous-répertoires et ma question est simplement la suivante: à peu près combien de fichiers devrais-je m'attendre à stocker dans un répertoire ext3 tout en ayant toujours des performances acceptables? Quelle est votre expérience?
Ou en d'autres termes; En supposant que j'ai besoin de stocker trois millions de fichiers dans la structure, combien de niveaux devraient profondément le ./a/b/c/abc.ext
la structure soit?
De toute évidence, c'est une question qui ne peut pas être répondue exactement, mais je recherche une estimation d'une estimation du parc de balle.
À condition que vous ayez une distribution qui soutient le dir_index
Capacité, vous pouvez facilement avoir 200 000 fichiers dans un répertoire unique. Je le garderais à environ 25 000, juste pour être en sécurité. Sans dir_index
, essayez de le garder à 5 000.
Soyez [~ # ~] très [~ # ~ ~] Soyez prudent comment vous sélectionnez la division du répertoire. "A/B/C" sonne comme une recette pour désastre pour moi ...
Ne faites pas seulement aveuglément faire une structure profonde de plusieurs répertoires, disons 100 entrées au premier niveau, 100 entrées au deuxième niveau, 100 entrées au troisième. Je suis allé là-bas, j'ai fait cela, a obtenu la veste et j'ai dû la restructurer lorsque la performance est allé dans le Crapper avec quelques millions de fichiers. :-)
Nous avons un client qui a fait la disposition "Directoires multiples" et finit par mettre à peine un à cinq fichiers par répertoire, ce qui les tuait. 3 à 6 heures pour faire un "DU" dans cette structure de répertoire. Le Sauveur était SSD, ils ne voulaient pas réécrire cette partie de leur candidature et une SSD a pris ce temps Du de l'heure à quelques minutes.
Le problème est que chaque niveau de recherche de répertoires prend des cherches et cherche très cher. La taille du répertoire est également un facteur, de sorte qu'il soit plus petit plutôt que plus grand est une grande victoire.
Pour répondre à votre question sur le nombre de fichiers par répertoire, 1 000 que j'ai entendu parler de "optimum" mais que la performance à 10 000 semble aller bien.
Donc, ce que je recommanderais, c'est un niveau de répertoires, chaque niveau étant un répertoire de 2 caractères de longue date, constitué de lettres majuscules et minuscules et les chiffres, pour environ 3800 répertoires au niveau supérieur. Vous pouvez ensuite contenir des fichiers de 14 m avec ces sous-répertoires contenant 3800 fichiers ou environ 1 000 fichiers par sous-répertoire pour les fichiers 3M.
J'ai fait un changement comme celui-ci pour un autre client et cela a fait une énorme différence.
Je vous suggère d'essayer de tester diverses tailles de répertoires avec un outil de référence tel que cachet de la poste , car il existe de nombreuses variables telles que la taille du cache (à la fois dans le système d'exploitation et dans le sous-système de disque) qui dépendent de votre environnement.
Ma règle générale personnelle consiste à viser une taille de répertoire de fichiers <= 20k, même si j'ai vu des performances relativement décentes avec des fichiers/répertoires jusqu'à 100 000.
J'ai tous les fichiers aux dossiers comme:
uploads/[date]/[heure] /to.png
et ne pas avoir de problèmes de performance.
http://fr.wikipedia.org/wiki/ext3#Fonctionnement - Cela mentionne qu'un répertoire ne peut avoir qu'environ 32 000 sous-répertoires, mais ne fait aucune mention de fichiers.
http://roopindersingh.com/2008/05/10/ext3-Handling-large-number-ffiles-in-a-directory/
En outre, je déteste des experts échange, mais j'ai lu un commentaire sur cette question qu'il est idéal d'avoir moins de 10-15 000 par répertoire.
Hmm, j'ai lu cet article récemment . Essentiellement, vous tirez parti de la distribution de votre algorithme de hachage préféré. J'ai commencé à jouer avec les chiffres, un MySQL signé INT a une valeur maximale de 2147483647. Vous pouvez également modifier le nombre de fichiers souhaité par répertoire et numéro de sous-répertoires à régler sur le numéro final . -des sous-répertoires/fichiers-per-annuaire Split pour un ensemble de données donné, mais il est difficile de trouver des preuves empiriques sur des organisations de répertoires/fichiers optimales. Cet article donne une idée des différences de performance entre les systèmes de fichiers (quelques métriques intéressantes), mais rien sur les organisations optimales.
Dans mon expérience, la meilleure approche est de ne pas trop ingénierie de la structure de fichiers à l'avance. Comme mentionné dans au moins une autre réponse, il existe des extensions de système de fichiers qui traitent de la fin de la performance.
Le problème que j'ai frappé plus fréquemment est une convivialité à la fin administrative. Le moins de travail que vous puissiez faire pour diminuer le nombre de fichiers dans un répertoire est probablement l'approche dont vous avez besoin maintenant.
sqrt (3_000_000) == 1732
Quelques milliers de fichiers dans un seul répertoire me semble raisonnable. Soyez votre propre juge pour votre propre situation. Pour y parvenir, essayez de scinder les fichiers dans un seul niveau de répertoires de hachage de manière à ce que le nombre moyen de fichiers par répertoire soit à peu près identique au nombre de répertoires.
Compte tenu de votre exemple, ce serait ./a/abc.ext
, ./ab/abc.ext
, ./abc/abc.ext
, ....
La propagation des fichiers dépendra fortement des noms de fichiers réels. Imaginez appliquer cette technique à un répertoire d'un million de fichiers appelé foobar???.txt
. Il existe des moyens d'accomplir une propagation plus voire diffusée, comme le hachage en fonction de la valeur d'un nombre particulier de bits de la somme du MD5 de chaque nom de fichier, mais je vais oser deviner que cela seraient surchargés pour ce que vous essayez d'accomplir.
Je pense que vous mettez trop de pensée dans tout cela. Si vous choisissez même un niveau supplémentaire unique de répertoires et ont pu équilibrer les choses de façon uniforme, vous auriez 1732 répertoires * et 1732 fichiers par répertoire.
Sauf si vous prévoyez besoin des dizaines de milliards de fichiers, vous pouvez choisir à peu près un nombre compris entre 1000 et 100 000 et obtenir de bons résultats.
* Racine carrée de 3 millions.