Não foi possível criar arquivos no sistema de arquivos XFS grande

24

Temos um servidor Linux com um sistema de arquivos de 4 TB, usado para armazenar repositórios do subversion. Existem muitos repositórios, vários dos quais estão em uso há vários anos.

O disco tinha originalmente cerca de 1 TB, mas começamos a ficar sem espaço e aumentamos para 4 TB cerca de um ano atrás. Agora, as pessoas estão relatando que não podem fazer check-in de arquivos em seus repositórios. A mensagem de erro é No space left on device.

O disco possui cerca de 1,5 TB de espaço livre e também informa que há inodes gratuitos - e, no entanto, não é possível criar um novo arquivo nele. Ainda é possível atualizar arquivos antigos e, de forma intermitente, alguns repositórios serão atualizados, mas o mesmo repositório poderá falhar na próxima tentativa.

Jenny D diz Restabelecer Monica
fonte

Respostas:

44

A razão do problema

O problema é como o XFS aloca inodes. Diferentemente da maioria dos sistemas de arquivos, a alocação acontece dinamicamente à medida que novos arquivos são criados. No entanto, a menos que você especifique o contrário, os inodes são limitados a valores de 32 bits, o que significa que eles devem caber no primeiro terabyte de armazenamento no sistema de arquivos. Portanto, se você preencheu completamente esse primeiro terabyte e ampliou o disco, ainda não conseguiu criar novos arquivos, pois os inodes não podem ser criados no novo espaço.

Solução 1 - altere as opções de montagem

Uma solução é montar novamente o sistema de arquivos com a opção de montagem inode64. No entanto, alguns aplicativos se comportarão de maneira estranha nisso (por exemplo, MySQL), e o NFS ficará muito confuso. Portanto, se você não tiver certeza de que seu sistema funcionará com essa opção, você poderá passar para a próxima opção.

Solução 2 - mover arquivos

A segunda solução é encontrar alguns dos arquivos atualmente armazenados no primeiro terabyte e movê-los para outra área do sistema de arquivos.

Movendo-se por idade

No nosso caso, isso foi fácil - o sistema de arquivos estava em uso há anos, para que pudéssemos simplesmente encontrar os arquivos mais antigos e afastá-los do sistema de arquivos e depois movê-los de volta. Isso foi feito facilmente usando o find:

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

nos deu uma lista contendo o tamanho e o nome do diretório para todos os diretórios exatamente 3 níveis abaixo do ponto de montagem, com mais de 2 anos. Poderíamos, então, classificar a lista para encontrar os maiores diretórios e usá mv-los para movê-los para outro sistema de arquivos e vice-versa.

Movendo por grupo de alocação

Se você não pode simplesmente passar por idade, por exemplo, quando muitos arquivos foram criados ao mesmo tempo, ainda é possível encontrar os arquivos certos para mover, mas isso leva um pouco mais de tempo.

O XFS possui grupos de alocação (também conhecidos como AGs ), começando com 0. Você pode verificar o tamanho e o número de blocos de cada AG para descobrir quais grupos estão no primeiro terabyte usando xfs_info /path/to/mountpoint. Ou você pode apenas verificar os primeiros AGs para ver quais estão cheios e depois limpá-los.

  1. Verificando o espaço livre nos quatro primeiros AGs:
para ag em `seq 0 1 5`; ecoa o espaço livre em AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total grátis"; feito

Se o espaço livre total em qualquer grupo for menor que 40, você não poderá criar novos arquivos nele.

  1. Encontre arquivos nesse AG

Isso requer a verificação dos metadados para cada arquivo no sistema de arquivos. Vai demorar muito tempo ... Aqui está uma sugestão:

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

Você pode então grep for " 0 "(que é um espaço, um zero e outro espaço) para encontrar todos os arquivos no AG 0, grep para encontrar os arquivos " 1 "no AG 1, etc ... Comece com AG 0, mova os arquivos maiores para longe (usando mv, não cp!) e depois novamente. Repita até que você tenha uma quantidade razoável de espaço livre.

Resultado

Depois que removemos arquivos suficientes de / extra e voltamos novamente, havia muito espaço no AG 0 e, mais uma vez, foi possível criar novos arquivos.

Jenny D diz Restabelecer Monica
fonte