Esse problema é especialmente aparente em meios magnéticos, embora os SSDs também sofram com ele. Vamos tentar desfragmentar um sistema de arquivos XFS nesta postagem.
Primeiro, para experimentar o sistema de arquivos XFS, decidi criar uma bancada de teste em vez de trabalhar com dados críticos em um disco. Este Testbench é composto por uma VM Ubuntu à qual um disco virtual está conectado, fornecendo armazenamento bruto. Você pode usar o VirtualBox para criar a VM e depois criar um disco adicional para anexar à VM
Basta ir para as configurações da sua VM e sob Configurações → Armazenamento Seção Você pode adicionar um novo disco ao controlador SATA, você pode criar um novo disco. Como mostrado abaixo, mas verifique se sua VM está desligada quando você faz isso.
Depois que o novo disco for criado, ligue a VM e abra o terminal. O comando LSBLK lista todos os dispositivos de bloco disponíveis.
$ lsblk
SDA 8: 0 0 60G 0 disco
├─sda1 8: 1 0 1m 0 parte
└─sda2 8: 2 0 60g 0 Parte /
sdb 8:16 0 100g 0 disco
SR0 11: 0 1 1024M 0 ROM
Além do dispositivo de bloco principal SDA, Onde o sistema operacional está instalado, agora há um novo dispositivo SDB. Vamos criar rapidamente uma partição e formatá -la com o sistema de arquivos XFS.
Abra o utilitário separado como usuário root:
$ separado -um ideal /dev /sdb
Vamos criar uma tabela de partição primeiro usando o mklabel, seguido por criação de uma única partição a partir de todo o disco (que tem 107 GB de tamanho). Você pode verificar se a partição é feita listando -a usando o comando print:
(Partido) Mklabel GPT
(Partido) MkPart Primary 0 107
(separado) impressão
(Partido) Saia
Ok, agora podemos ver usando o LSBLK que existe um novo dispositivo de bloco sob o dispositivo SDB, chamado SDB1.
Vamos formatar esse armazenamento como XFS e montá -lo no diretório /MNT. Novamente, faça as seguintes ações como raiz:
$ mkfs.xfs /dev /sdb1
$ mount /dev /sdb1 /mnt
$ df -h
O último comando imprimirá todos os sistemas de arquivos montados e você pode verificar se /dev /sdb1 está montado em /mnt.
Em seguida, escrevemos um monte de arquivos como dados fictícios para desfragamento aqui:
$ dd if =/dev/urandom de =/mnt/myfile.contagem txt = 1024 bs = 1024
O comando acima escreveria um arquivo myfile.TXT de tamanho de 1 MB. Você pode automaticamente este comando em um loop simples usando Bash e gerar mais arquivos desses. Espalhe -os por vários diretórios, se quiser. Exclua alguns deles aleatoriamente. Faça tudo isso dentro do sistema de arquivos XFS (montado em /MNT) e verifique a fragmentação. Tudo isso é, é claro, opcional.
Desfragamento do seu sistema de arquivos
A primeira coisa que precisamos fazer é descobrir como verificar a quantidade de fragmentação. Por exemplo, o sistema de arquivos XFS que criamos anteriormente estava no nó de dispositivo /dev /sdb. Podemos usar o utilitário xfs_db (significa XFS Debugging) para verificar o nível de fragmentação.
$ xfs_db -c frag -r /dev /sdb1
A bandeira -c recebe vários comandos entre os quais o comando frag para verificar o nível de fragmentação. A bandeira -r usada para garantir que a operação seja totalmente leitura somente.
Se descobrirmos que existe alguma fragmentação neste sistema de arquivos, executamos o comando xfs_fsr no nó do dispositivo:
$ xfs_fsr /dev /sdb1
Este último comando é tudo o que há para desfragitar seu sistema de arquivos, você pode adicionar isso como um cronjob que monitora regularmente seu sistema de arquivos. Mas fazer isso pelo XFS faz pouco sentido. A alocação baseada em extensão do XFS garante que problemas como fragmentação permaneçam no mínimo.
Casos de uso
Os casos de uso em que você precisa mais se preocupar com a fragmentação do sistema de arquivos envolve aplicativos onde muitos pequenos pedaços de dados são escritos e reescritos. Um banco de dados é um exemplo clássico disso e os bancos de dados são notórios por deixar muitos e muitos "buracos" em seu armazenamento. Os blocos de memória não estão contiguamente preenchidos, tornando a quantidade de espaço disponível cada vez menor ao longo do tempo.
O problema surge não apenas em termos de espaço útil reduzido, mas também em termos de IOPS reduzida, o que pode prejudicar o desempenho do seu aplicativo. Ter um script para monitorar continuamente o nível de fragmentação é uma maneira conservadora de manter o sistema. Você não deseja que um script automatizado comece aleatoriamente a desfragmentação do seu sistema de arquivos, especialmente quando está sendo usado em pico de carga.