No se pueden crear archivos en un gran sistema de archivos XFS

24

Tenemos un servidor Linux con un sistema de archivos de 4 TB, que se utiliza para almacenar repositorios de subversión. Hay muchos repositorios, varios de los cuales han estado en uso durante varios años.

El disco originalmente era de aproximadamente 1 TB, pero comenzamos a quedarnos sin espacio y lo aumentamos a 4 TB hace aproximadamente un año. Ahora, las personas informan que no pueden registrar archivos en sus repositorios. El mensaje de error es No space left on device.

El disco tiene aproximadamente 1,5 TB libres, y también informa que tiene inodos libres, y sin embargo, no es posible crear un nuevo archivo en él. Todavía es posible actualizar archivos antiguos e intermitentemente se actualizarán algunos repositorios, pero el mismo repositorio puede fallar en el próximo intento.

Jenny D dice Reinstate Monica
fuente

Respuestas:

44

La razón del problema

El problema resulta ser cómo XFS asigna los inodos. A diferencia de la mayoría de los sistemas de archivos, la asignación ocurre dinámicamente a medida que se crean nuevos archivos. Sin embargo, a menos que especifique lo contrario, los inodes están limitados a valores de 32 bits, lo que significa que deben caber dentro del primer terabyte de almacenamiento en el sistema de archivos. Entonces, si llena por completo ese primer terabyte y luego amplía el disco, aún no podrá crear nuevos archivos, ya que los inodos no se pueden crear en el nuevo espacio.

Solución 1 - cambiar las opciones de montaje

Una solución es volver a montar el sistema de archivos con la opción de montaje inode64. Sin embargo, algunas aplicaciones se comportarán de manera extraña en esto (por ejemplo, MySQL), y NFS estará muy confundido. Entonces, si no está seguro de que su sistema funcionará con esta opción, puede pasar a la siguiente opción.

Solución 2 - mover archivos

La segunda solución es encontrar algunos de los archivos que están almacenados actualmente en el primer terabyte y moverlos a otra área del sistema de archivos.

Moviéndose por edad

En nuestro caso, esto fue fácil: el sistema de archivos había estado en uso durante años, por lo que simplemente podíamos encontrar los archivos más antiguos y alejarlos del sistema de archivos, y luego volver a moverlos. Esto se hizo fácilmente usando find:

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

nos dio una lista que contiene el tamaño y el nombre del directorio para todos los directorios en exactamente 3 niveles por debajo del punto de montaje, que tenían más de 2 años. Luego, podríamos ordenar la lista para encontrar los directorios más grandes y usarlos mvpara alejarlos a otro sistema de archivos y volver a ellos.

Moviéndose por grupo de asignación

Si no puede simplemente ir por edad, por ejemplo, cuando se crearon muchos archivos al mismo tiempo, aún puede encontrar los archivos correctos para mover, pero lleva un poco más de tiempo.

XFS tiene grupos de asignación (también conocidos como AG s), comenzando con 0. Puede verificar el tamaño de bloque y el número de bloques de cada AG para averiguar qué grupos están en el primer terabyte, utilizando xfs_info /path/to/mountpoint. O simplemente puede verificar los primeros AG para ver cuáles están llenos y luego borrarlos.

  1. Comprobación del espacio libre en los primeros cuatro AG:
para ag en `seq 0 1 5`; hacer eco de espacio libre en AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total libre"; hecho

Si el espacio libre total en cualquier grupo es inferior a 40, no podrá crear nuevos archivos en él.

  1. Encuentra archivos en ese AG

Esto requiere verificar los metadatos para cada archivo en el sistema de archivos. Tomará mucho tiempo ... Aquí hay una sugerencia:

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

Luego puede grep para " 0 "(que es un espacio, un cero y otro espacio) para encontrar todos los archivos en AG 0, grep para encontrar los archivos " 1 "en AG 1, etc. Comience con AG 0, aleje los archivos más grandes (usando mv, no cp!) y luego de nuevo. Repita hasta que tenga una buena cantidad de espacio libre.

Salir

Una vez que habíamos movido suficientes archivos de / extra y luego de nuevo, había mucho espacio en AG 0 y una vez más era posible crear nuevos archivos.

Jenny D dice Reinstate Monica
fuente