gérer beaucoup de petits fichiers temporaires

J’ai un serveur Web qui enregistre les fichiers de cache et les conserve pendant 7 jours. Les noms de fichiers sont des hachages md5, soit exactement 32 caractères hexadécimaux, et sont conservés dans une arborescence qui ressemble à ceci:

00/ 00/ 00000ae9355e59a3d8a314a5470753d8 . . 00/ 01/ 

Vous avez eu l’idée.

Mon problème est que la suppression des anciens fichiers prend beaucoup de temps. J’ai un job quotidien qui fonctionne

 find cache/ -mtime +7 -type f -delete 

qui prend plus d’une demi-journée à compléter. Je m’inquiète de l’évolutivité et de l’effet que cela a sur les performances du serveur. De plus, le répertoire de cache est maintenant un trou noir dans mon système, piégeant le ou les innocents occasionnels.

La solution standard du cache LRU est une sorte de tas. Existe-t-il un moyen de l’adapter au niveau du système de fichiers? Existe-t-il un autre moyen de le mettre en œuvre de manière à faciliter sa gestion?

Voici des idées que j’ai considérées:

  1. Créez 7 meilleurs répertoires, un pour chaque jour de la semaine, et videz un répertoire chaque jour. Cela augmente le temps de recherche d’un fichier cache de 7 fois, le rend vraiment compliqué quand un fichier est écrasé et je ne suis pas sûr de ce qu’il va faire au moment de la suppression.
  2. Enregistrez les fichiers sous forme de blobs dans une table MySQL avec des index sur le nom et la date. Cela semblait prometteur, mais en pratique, cela a toujours été beaucoup plus lent que celui de FS. Peut-être que je ne le fais pas bien.

Des idées?

Lorsque vous stockez un fichier, créez un lien symbolique vers une deuxième structure de répertoire organisée par date et non par nom.

Récupérez vos fichiers en utilisant la structure “name”, supprimez-les en utilisant la structure “date”.

En supposant que c’est ext2 / 3, avez-vous essayé d’append des répertoires indexés? Lorsque vous avez un grand nombre de fichiers dans un répertoire particulier, la recherche sera terriblement lente à supprimer quelque chose.
utilisez tune2fs -o dir_index pour activer l’option dir_index.
Lors du assembly d’un système de fichiers, assurez-vous d’utiliser l’option noatime, qui empêche le système d’exploitation de mettre à jour les informations de temps d’access pour les répertoires (doit toujours les modifier).
En regardant le message original, il semble que vous ayez seulement 2 niveaux d’indirection vers les fichiers, ce qui signifie que vous pouvez avoir un grand nombre de fichiers dans les répertoires feuilles. Lorsqu’il y a plus d’un million d’entrées, vous constaterez que les recherches et les modifications sont extrêmement lentes. Une alternative consiste à utiliser une hiérarchie plus profonde des répertoires, en réduisant le nombre d’éléments dans un répertoire particulier, réduisant ainsi le coût de la recherche et les mises à jour du répertoire individuel particulier.

Reiserfs est relativement efficace dans le traitement des petits fichiers. Avez-vous essayé différents systèmes de fichiers Linux? Je ne suis pas sûr des performances de suppression – vous pouvez envisager le formatage (mkfs) en remplacement de la suppression de fichiers individuels. Par exemple, vous pouvez créer un système de fichiers différent (cache1, cache2, …) pour chaque jour de la semaine.

Que dis-tu de ça:

  • Avoir un autre dossier appelé, disons, “ToDelete”
  • Lorsque vous ajoutez un nouvel élément, obtenez la date d’aujourd’hui et recherchez un sous-dossier dans “ToDelete” qui porte un nom indiquant la date du jour.
  • Si ce n’est pas là, créez-le
  • Ajouter un lien symbolique à l’article que vous avez créé dans le dossier d’aujourd’hui
  • Créez un job cron qui va dans le dossier “ToDelete” qui est à la date correcte et supprimez tous les dossiers liés.
  • Supprimez le dossier contenant tous les liens.

Que diriez-vous d’avoir une table dans votre firebase database qui utilise le hachage comme clé. L’autre champ serait alors le nom du fichier. De cette façon, le fichier peut être stocké selon une date pour une suppression rapide, et la firebase database peut être utilisée pour trouver rapidement l’emplacement de ce fichier en fonction du hachage.