Não é possível criar arquivos em um sistema de arquivos XFS grande

22

Temos um servidor Linux com um sistema de arquivos de 4 TB, que é 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 era originalmente de cerca de 1 TB, mas começamos a ficar sem espaço e aumentamos para 4 TB há um ano. Agora, as pessoas estão relatando serem incapazes de registrar os arquivos em seus repositórios. A mensagem de erro é No space left on device .

O disco tem cerca de 1,5 TB livre e também informa ter inodes gratuitos - e ainda assim, 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.

    
por Jenny D 02.06.2015 / 12:19

1 resposta

43

A razão do problema

O problema está em como o XFS aloca inodes. Ao contrário 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 dentro do primeiro terabyte de armazenamento no sistema de arquivos. Portanto, se você preencher completamente esse primeiro terabyte e ampliar o disco, ainda será incapaz de criar novos arquivos, já que os inodes não podem ser criados no novo espaço.

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

Uma solução é montar novamente o sistema de arquivos com a opção de montagem inode64 . No entanto, algumas aplicações irão se comportar estranhamente sobre isso (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, então poderíamos simplesmente encontrar os arquivos mais antigos e movê-los para longe do sistema de arquivos, e então 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 em exatamente 3 níveis abaixo do ponto de montagem, que eram mais antigos que 2 anos. Poderíamos então classificar a lista para encontrar os maiores diretórios e usar mv para movê-los para outro sistema de arquivos e vice-versa.

Movendo pelo grupo de alocação

Se você não puder simplesmente envelhecer, por exemplo, Quando muitos arquivos foram criados ao mesmo tempo, você ainda pode encontrar os arquivos certos para mover, mas isso leva um pouco mais de tempo.

O XFS tem grupos de alocação (aka AG s), começando com 0. Você pode verificar o tamanho do bloco e o número de blocos de cada AG para descobrir quais grupos estão no primeiro terabyte, usando% código%. 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 primeiros quatro AGs:
for ag in 'seq 0 1 5'; do echo freespace in AG $ag; xfs_db -r -c "freesp -s -a $ag" /dev/CACHE/CACHE ; grep "total free"; done

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

  1. Encontrar arquivos nessa AG

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

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

Você pode, então, grep para xfs_info /path/to/mountpoint (espaço, zero e outro espaço) para encontrar todos os arquivos em AG 0, grep para " 0 " para encontrar os arquivos em AG 1, etc ... Comece com AG 0, mova os arquivos maiores para fora (usando " 1 " , não mv !) E, em seguida, novamente. Repita até que você tenha uma boa quantidade de espaço livre.

Resultado

Depois de movermos arquivos suficientes para / extra e depois novamente, havia muito espaço em AG 0 e foi mais uma vez possível criar novos arquivos.

    
por 02.06.2015 / 12:19