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.

3 comentários:

Anônimo disse...

Eu também uso já faz um bom tempo, partições formatadas com XFS, principalmente para banco de dados e outras áreas com tamanho considerável.

Contudo, para partições do tipo TMP ETC / BOOTeu uso o imbatível EXT3, pois essas partições eu as coloco em torno de 1024K. E como são arquivos pequenos, o EXT3 é mais rápido. Além disso, o XFS ocupa um espaço grande para suas anotações, o chamado journaling, usado para recuperar dados.

Eu recomendo fortemente o uso do EXT3 para o / (raiz) /boot /etc e /tmp pois se der um pau no journal do XFS na partição raiz por exemplo, o sistema pode não levantar, mas no caso do EXT3 você pode montá-lo como EXT2 no caso de emergência.

[]
Roger

Anônimo disse...

Opa, tudo bem?

Realmente o desempenho do XFS é muito bom, usei por uns 2 meses aqui e era visívelmente mais veloz que o ReiserFS e o Ext3. Entretanto, usá-lo sem um no-break pode ser perigoso, uma vez que o jornaling pode se perder com desligamentos inesperados.

Nesse tempo, usei o XFS até o dia em que tive vários desligamentos inesperados e então percebi que vários arquivos foram perdidos (ficaram corrompidos), chegando ao ponto do sistema sequer iniciar (isso foi em um outro dia). Atualmente estou usando apenas o Ext3 aqui.

Há, somente agora li seu comentário em meu blogue, foi bastante esclarecedor. Até mais!

Anônimo disse...

intiresno muito, obrigado