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.