Desfragmentanto partições XFS

Quando você copia um documento para um sistema de arquivos XFS, você normalmente fica com um único bloco de dados que contém todo fragmento (extent) do arquivo. Se você precisar estender o arquivo ou sobrescreve-lo com algum dado, a área adjacente ao arquivo (no disco) pode não estar disponível, então será preciso dividí-lo em dois fragmentos, em diferentes localizações. É claro que aplicações acessando  arquivos não precisam se preocupar com isto, estas apenas lêem o conteúdo do começo até o final e percorrem (lseek) o arquivo como se ele estivesse em uma faixa linear de bytes. Entretanto, a existência de muitos fragmentos espalhados pelo disco engendram um custo computacional elevado.  Esse post apresenta um utilitário para resolver esse problema nos sistemas de arquivos XFS.

Instalação

O pacote xfsdump contém o utilitário xfs_fsr descrito nesse post. Para instalá-lo no Ubuntu basta digitar, no terminal: apt-get install xfsdump

Uso

Se você deseja saber qual a fragmentação de todo o sistema de arquivos, use o utilitário xfs_db. A opção -r indica para o xfs_db uma operação no modo somente-leitura, no qual permite você utilizá-lo em uma partição montada e em uso, e é uma boa alternativa a menos que você realmente deseje modificar o sistema de arquivos. O comando frag causa uma atividade em disco durante um determinado período de tempo (alguns segundos) e relata a fragmentação do sistema de arquivos, como mostrado abaixo:

# xfs_db -r /dev/sda3
# xfs_db> frag
actual 491234, ideal 489947, fragmentation factor 0.26%

Agora imagine um arquivo armazenado no sistema de arquivos, você pode utilizar o utilitário xfs_bmap para ver o número de extents (fragmentos) presente. No caso do arquivo abaixo, o sistema de arquivos dividiu um arquivo tar.bz2 de 192MB em dois extents.

# du -sh backup-snapshot.tar.bz2
192M    backup-snapshot.tar.bz2

# xfs_bmap -v backup-snapshot.tar.bz2
backup-snapshot.tar.bz2:
EXT: FILE-OFFSET      BLOCK-RANGE           AG AG-OFFSET                 TOTAL
0: [0..2687]:             48939728..48942415 13 (1336224..1338911)    2688
1: [2688..392207]:   49045120..49434639 13 (1441616..1831135)    389520

Você pode executar o xfs_fsr de duas formas; ou passar a duração (tempo) e começar a percorrer todo o sistema de arquivos procurando otimizar os arquivos mais fragmentados até o completar o tempo estipulado, ou então explicitamente definir uma partição no sistema de arquivos ou arquivo para ser desfragmentado. Quando você executa o xfs_fsr com um tempo de duração e este termina antes que a tenha sido percorrido o sistema de arquivos por completo, o xfs_fsr guarda essa informação num arquivo em /var/tmp para que possa ser continuado no mesmo ponto da próxima vez que for executado. Dessa maneira você pode agendar uma tarefa no cron e efetuar aos poucos a otimização do seu sistema de arquivos.

Porquê o nosso arquivo de backup apresenta dois extents nós podemos utilizar o xfs_fsr explicitamente para corrigir o arquivo:

# xfs_fsr backup-snapshot.tar.bz2

Para otimizar um arquivo fragmentado, o xfs_fsr cria uma nova cópia  deste com menos extents que o original. Uma vez que o conteúdo do arquivo é copiado para um novo arquivo, as informações (metadata) do sistema de arquivos são atualizadas para que o novo arquivo substitua o antigo. Esta operação implica em um espaço livre em disco suficiente para armazenar uma cópia do arquivo que se deseja desfragmentar. Atenção: para as quotas em disco, se a cópia exceder o tamanho máximo  da quota  do usuário o arquivo não poderá ser desfragmentado.

Verificando novamente com o xfs_bmap:

# xfs_bmap -v backup-snapshot.tar.bz2
backup-snapshot.tar.bz2:
EXT: FILE-OFFSET      BLOCK-RANGE        AG AG-OFFSET          TOTAL
0: [0..392207]:     19158432..19550639  5 (849392..1241599) 392208

Algumas precauções quando você estiver desframentando todo o sistema de arquivos: se você estiver  utilizando um bootloader como o LILO, que espera que seu arquivo de configuração esteja numa posição fixa do disco, é preciso definir flags especificas para esses arquivos ou diretórios não sejam alterados pois o xfs_fsr pode mover o arquivo para desfragmentá-lo. A flag no-defrag (setada utilizando o comando xfs_io) faz com que o xfs_fsr nunca tente desframentar estes arquivos. Se você marcar um diretório com a flag no-defrag esta será replicada para todos os arquivos e subdiretórios. Para mais informaçoes acesse o manual do xfs_fsr e veja como utilizar a flag no-defrag.

Para rodar o xfs_fsr regularmente via cron, você pode invocá-lo com nenhum argumento ou então com o único parâmetro que você provavelmente ira usar é o -t para especificar quanto tempo (em segundos) você quer que o xfs_fsr fique em execução. O padrão é 7200 (duas horas); para uma máquina desktop você pode definir um tempo de 6 horas e fazê-lo apenas apenas quando o sistema estiver no modo sleep. Uma sugestão:

# cd /root
# mkdir -p mycron
# cd mycron
# vi xfs-fsr.cron
30 0 * * * /root/mycron/xfs-fsr.sh
# vi xfs-fsr.sh
/usr/sbin/xfs_fsr -t 21600 >/dev/null 2>&1
# cat *.cron >|newtab
# crontab newtab

Esse texto é uma tradução pessoal do mini tutorial publicado no Linux.com com a exceção que os exemplos apresentados são do disco rídigo do meu computador.

Uma resposta

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: