2007-07-09

Meu mix ideal de sistemas de arquivos

Fatos sobre sistemas de arquivos:

  • XFS é rápido e ultra-seguro
  • XFS é especialmente rápido com arquivos grandes (1 MB ou maiores), e um tanto lento com arquivos pequenos
  • A velocidade do ReiserFS é imbatível ao manipular diretórios lotados de arquivos pequenos
  • Já tive sérios problemas de perda de dados espontânea com ReiserFS, e não uso mais esse sistema de arquivos para guardar dados importantes
  • Todo sistema de arquivos sofre fragmentação, em maior ou menor escala

Problema

Os diretórios com grande "tráfego" (isto é, apagamento e criação) de arquivos podem prejudicar muito o desempenho do sistema de arquivos no qual residem, promovendo a fragmentação. São exemplos desse tráfego, no Gentoo: /usr/src/ (one fica o código-fonte do kernel), /var/cache/ (onde fica o cache de ferramentas como CUPS, man, samba etc.), /usr/portage/ (onde reside a árvore do Portage) e /var/tmp/portage (onde o Gentoo faz todas as compilações dos pacotes de programas).

Soluções

Dispositivos de loop são uma forma de você criar uma partição de dados em um único arquivo. Os diretórios /var/cache/, /usr/portage/ e /usr/src/ precisam preservar seu conteúdo depois de reinicializações. Mas o /var/tmp/portage não.

/var/tmp/portage

O conteúdo desse diretório tem muito I/O (entrada e saída, ou seja, gravações e leituras), mas assim que a instalação de um pacote termina, todos os arquivos relativos a este são apagados. Então, façamos como sugere o Gentoo wiki e usemos o sistema de arquivos tmpfs (que usa apenas a memória RAM para guardar dados) para abrigar o /var/tmp/portage/, adicionando a seguinte linha ao arquivo /etc/fstab:

none   /var/tmp/portage   tmpfs   auto,size=2G.nr_inodes=1M   0 0

Mas atenção: dependendo da sua quantidade de memória, essa mudança específica pode acabar sendo prejudicial, pois pode aumentar muito o uso de swap. Confira o wiki do Gentoo para se informar melhor

outros diretórios

Quanto espaço ocupa o /usr/portage/?

bash$ du -sh /usr/portage/
538M    /usr/portage/

Vamos criar um arquivo um pouco maior (pra ter uma folguinha)

bash$ sudo dd if=/dev/zero of=/usr/img.portage bs=1M count=600

Pronto. Criamos um arquivo de 600 MB pra abrigar um diretório que atualmente tem 538 MB. Deve ser suficiente por algum tempo. Agora, vamos formatar esse arquivo com um sistema de arquivos, como se fosse uma partição:

bash$ sudo mkreiserfs -f /usr/img.portage

Agora vamos montar essa nova "partição" como loop device e copiar para ela tudo que está no diretório original:

bash$ sudo mount -t reiserfs -o loop,notail,noatime /usr/img.portage /mnt/floppy
bash$ sudo rsync -av /usr/portage/ /mnt/floppy/
bash$ sudo umount /mnt/floppy/

Não se esqueça das barras no final dos nomes dos diretórios!

Já podemos fazer o mesmo com os outros diretórios.

bash$ sudo du -sh /usr/src/
556M    /usr/src/
bash$ sudo dd if=/dev/zero of=/usr/img.src bs=1M count=1000
bash$ sudo mkreiserfs -f /usr/img.src
bash$ sudo mount -t reiserfs -o loop,notail,noatime /usr/img.src /mnt/floppy/
bash$ sudo rsync -av /usr/src/ /mnt/floppy/
bash$ sudo umount /mnt/floppy/

bash$ sudo du -sh /var/cache/
106M    /var/cache/
bash$ sudo dd if=/dev/zero of=/var/img.cache bs=1M count=100
bash$ sudo mkreiserfs -f /var/img.cache
bash$ sudo mount -t reiserfs -o loop,notail,noatime /var/img.cache /mnt/floppy/
bash$ sudo rsync -av /var/cache/ /mnt/floppy/
bash$ sudo umount /mnt/floppy/

Ao final, basta acrescentar essas informações ao arquivo /etc/fstab para que os arquivos de loop sejam montados automaticamente na inicialização

/usr/img.portage  /usr/portage  reiserfs  loop,auto,noatime  0 0
/usr/img.src      /usr/src      reiserfs  loop,auto,noatime  0 0
/var/img.cache    /var/cache    reiserfs  loop,auto,noatime  0 0

Conclusão

Depois disso, todas as tarefas que envolvem a manipulação desses diretórios ficaram significativamente mais rápidas (benchmarks são bem vindos). :)

Só pra exemplificar, o eix-sync passou a levar só 1 a 2 minutos.

Postar um comentário