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 tinha originalmente cerca de 1 TB, mas começamos a ficar sem espaço e aumentamos para 4 TB há cerca de um ano. Agora, as pessoas estão relatando que não conseguem fazer check-in de 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 relata ter inodes livres - 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 pode falhar na próxima tentativa.
A razão do problema
O problema acaba sendo como o XFS aloca inodes. Ao contrário da maioria dos sistemas de arquivos, a alocação ocorre 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ê preencher completamente o primeiro terabyte e aumentar o disco, ainda não poderá criar novos arquivos, pois os inodes não podem ser criados no novo espaço.
Solução 1 - alterar as opções de montagem
Uma solução é remontar o sistema de arquivos com a opção mount
inode64
. No entanto, alguns aplicativos se comportarão de maneira estranha (por exemplo, MySQL) e o NFS ficará muito confuso. Portanto, se você não tiver certeza de que seu sistema funcionará com esta opção, poderá passar para a próxima opção.Solução 2 - mover arquivos
A segunda solução é encontrar alguns dos arquivos que estão atualmente armazenados no primeiro terabyte e movê-los para outra área do sistema de arquivos.
Mudança 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, movê-los para fora do sistema de arquivos e, em seguida, movê-los de volta. Isso foi feito facilmente usando find:
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, que tinham 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 ir por idade, por exemplo, quando muitos arquivos foram criados ao mesmo tempo, você ainda pode encontrar os arquivos certos para mover, mas leva um pouco mais de tempo.
O XFS tem grupos de alocação (também conhecidos como 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
xfs_info /path/to/mountpoint
. Ou você pode apenas verificar os primeiros AGs para ver quais estão cheios e, em seguida, limpá-los.Se o espaço livre total em qualquer grupo for menor que 40, você não poderá criar novos arquivos nele.
Isso requer a verificação dos metadados de cada arquivo no sistema de arquivos. Vai demorar muito ... Aqui vai uma sugestão:
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 for" 1 "
para encontrar os que estão no AG 1, etc... Comece com AG 0, mova os arquivos maiores para longe (usandomv
, nãocp
!) e depois de volta. Repita até ter uma boa quantidade de espaço livre.Resultado
Uma vez que movemos arquivos suficientes de /extra e depois voltamos, havia muito espaço no AG 0 e mais uma vez era possível criar novos arquivos.