Impossible de créer des fichiers sur un grand système de fichiers XFS

24

Nous avons un serveur Linux avec un système de fichiers de 4 To, qui est utilisé pour stocker les référentiels de subversion. Il existe de nombreux référentiels, dont plusieurs sont utilisés depuis plusieurs années.

Le disque était à l'origine d'environ 1 To, mais nous avons commencé à manquer d'espace et l'avons augmenté à 4 To il y a environ un an. Maintenant, les gens signalent ne pas pouvoir archiver les fichiers dans leurs référentiels. Le message d'erreur est No space left on device.

Le disque a environ 1,5 To de libre, et signale également avoir des inodes libres - et pourtant, il n'est pas possible de créer un nouveau fichier dessus. Il est toujours possible de mettre à jour d'anciens fichiers et, par intermittence, certains référentiels seront mis à jour, mais le même référentiel peut échouer lors de la prochaine tentative.

Jenny D dit de réintégrer Monica
la source

Réponses:

44

La raison du problème

Le problème se trouve dans la façon dont XFS alloue les inodes. Contrairement à la plupart des systèmes de fichiers, l'allocation se fait dynamiquement à mesure que de nouveaux fichiers sont créés. Cependant, sauf indication contraire, les inodes sont limités à des valeurs 32 bits, ce qui signifie qu'ils doivent tenir dans le premier téraoctet de stockage du système de fichiers. Donc, si vous remplissez complètement ce premier téraoctet, puis que vous agrandissez le disque, vous ne pourrez toujours pas créer de nouveaux fichiers, car les inodes ne peuvent pas être créés sur le nouvel espace.

Solution 1 - Modifier les options de montage

Une solution consiste à remonter le système de fichiers avec l'option de montage inode64. Cependant, certaines applications se comporteront bizarrement sur ce sujet (par exemple MySQL), et NFS sera très confus. Donc, si vous n'êtes pas sûr que votre système fonctionnera avec cette option, vous pouvez passer à l'option suivante.

Solution 2 - déplacer des fichiers

La deuxième solution consiste à rechercher certains des fichiers actuellement stockés dans le premier téraoctet et à les déplacer vers une autre zone du système de fichiers.

Se déplacer selon l'âge

Dans notre cas, c'était facile - le système de fichiers était utilisé depuis des années, donc nous pouvions simplement trouver les fichiers les plus anciens et les éloigner du système de fichiers, puis les reculer. Cela a été facilement fait en utilisant find:

find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt

nous a donné une liste contenant la taille et le nom du répertoire pour tous les répertoires à exactement 3 niveaux en dessous du point de montage, qui étaient âgés de plus de 2 ans. Nous pourrions alors trier la liste pour trouver les plus grands répertoires et les utiliser mvpour les déplacer vers un autre système de fichiers et inversement.

Déplacement par groupe d'allocation

Si vous ne pouvez pas simplement vous baser sur l'âge, par exemple lorsque de nombreux fichiers ont été créés en même temps, vous pouvez toujours trouver les bons fichiers à déplacer, mais cela prend un peu plus de temps.

XFS a des groupes d'allocation (alias AG ), commençant par 0. Vous pouvez vérifier la taille de bloc et le nombre de blocs de chaque AG pour déterminer quels groupes se trouvent sur le premier téraoctet à l'aide de xfs_info /path/to/mountpoint. Ou vous pouvez simplement vérifier les premiers AG pour voir lesquels sont pleins, puis les effacer.

  1. Vérification de l'espace libre dans les quatre premiers AG:
pour ag dans «seq 0 1 5»; faire écho espace libre dans AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total gratuit"; terminé

Si l'espace libre total dans un groupe est inférieur à 40, vous ne pourrez pas y créer de nouveaux fichiers.

  1. Rechercher des fichiers dans cette AG

Cela nécessite de vérifier les métadonnées de chaque fichier du système de fichiers. Cela prendra beaucoup de temps ... Voici une suggestion:

   find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt

Vous pouvez ensuite grep pour " 0 "(c'est un espace, un zéro et un autre espace) pour trouver tous les fichiers sur AG 0, grep pour " 1 "trouver ceux sur AG 1, etc ... Commencez par AG 0, éloignez les plus gros fichiers (en utilisant mv, non cp!) puis de nouveau. Répétez jusqu'à ce que vous ayez une bonne quantité d'espace libre.

Résultat

Une fois que nous avions éloigné suffisamment de fichiers de / extra, puis à nouveau, il y avait beaucoup d'espace dans AG 0 et il était à nouveau possible de créer de nouveaux fichiers.

Jenny D dit de réintégrer Monica
la source