Em muitas situações a performance do seu sistema de I/O pode limitar o desempenho do seu servidor.
Uma das maneiras de aumentar a performance é distribuir a leitura e a escrita por varios discos, num conceito chamado striping.
Nesta tecnica voce acessa varios discos simultaneamente, de forma que voce so vai tirar proveito desta tecnica se estiver usando controladoras SCSI em seu servidor, uma vez que as mesmas permitem acessar simultaneamente mais de um disco em um mesmo canal.
Nada impede que voce efetue stripes de discos IDE, porem voce nao vai notar nenhuma melhora significativa de performance
No FreeBSD voce pode implementar striping de duas formas, via CCD e via Vinum, neste tutorial vamos abordar o uso do CCD uma vez que ele é mais simples de ser utilizado, o ccd tambem possibilita a implementação de espelhamento de discos, que tem por objetivo implementar redundancia aos seus dados, e vamos ver um exemplo neste tutorial de como implementa-lo.
- Preparando o kernel
Para poder trabalhar com o CCD voce precisa incluir o suporte ao mesmo no seu kernel, para isto basta incluir as linhas a baixo no arquivo de configuração e recompila-lo:
pseudo-device ccd 4
Uma vez compilado o kernel voce deve criar os devices do ccd:
# cd /dev ; sh MAKDEV ccd0
- Instalando os discos
Para o nosso exemplo vamos utilizar 4 discos SCSI de 8 Gb identicos. Faça a instalação fisica dos discos, e de boot no seu servidor, os discos devm ser reconhecidos como da?, no nosso exemplo da0, da1, da2, da3. Se os discos foram reconhecidos no boot, precisamos disponibiliza-los para o sistema usando o comando disklabel:
# disklabel -r -w da0 auto
# disklabel -r -w da1 auto
# disklabel -r -w da2 auto
# disklabel -r -w da3 auto
Agora vejamos como esta o label do disco ad0, isso deve ser feito com o disklabel:
# disklabel -r ad0
O comando acima vai exibir uma serie de informações sobre o disco, mas as infomrações que nos interessam são sobre as partições do disco, no nosso exemplo vamos ver algo como:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 8305605 0 unused 0 0 # (Cyl. 0 - 516)
Como o CCD so trabalha com fstype 4.2BSD, precisamos criar uma nova partição deste tipo, para isso execute o comando:
# disklabel -e ad0
e adicione a linha:
e: 8305605 0 4.2BSD 0 0 0 # (Cyl. 0 - 516)
Saia salvando o arquivo, o editor que sera invocado sera o vi.
Use novamente o comando disklabel -r ad0 e veja se o mesmo traz a nova linha:
# disklabel -r ad0
...
...
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 8305605 0 unused 0 0 # (Cyl. 0 - 516)
e: 8305605 0 4.2BSD 0 0 0 # (Cyl. 0 - 516)
Voce deve repetir os passos acima para os demais discos, ad1, ad2, etc.
Agora que ja disponibilizamos os discos para o sistema operacional podemos configurar o ccd.
- Stripe simples
# ccdconfig ccd0 128 none /dev/da0e /dev/da1e /dev/da2e /dev/da3e
O comando acima ira criar um stripe com os 4 discos de 8 Gb, resultando em um unico disco de 32 Gb, a vantagem de se usar o stripe é que como voce dividiu a leitura e a gravaçao por 4 discos, a performance ira aumentar pois as cabeças do seu HD terão que se mover muito menos para gravar um mesmo volume de dados.
- Mirror simples
# ccdconfig ccd0 128 CCDF_MIRROR /dev/da0e /dev/da1e
O comando acima irá espelhar o disco da0 com o disco da1, ou seja os dados serão replicados e voce continuara tendo 8 Gb de espaço util, a vantagem de se espelhar os discos é que se caso o primeiro disco der problemas voce terá os dados duplicados no segundo e não terá perda de informaça, porém como seu sistema irá gravar 2 vezes a mesma informaçao, o desempenho do sistema de I/O sera ligeiramente degradado.
- Stripe + Mirror
# ccdconfig ccd0 128 CCDF_MIRROR /dev/da0e /dev/da1e /dev/da2e /dev/da3e
O comando acima ira criar um stripe com os discos da0 e da1 e espelha-lo com um segundo stripe feito com os discos da2 e da3, resultando em um unico disco de 16 Gb espelhado. Neste exemplo usamos a tecnica de stripe para minimizar a perda de performance introduzida pela tecninca de espelhamento.
- Criando as partições no CCD
Antes de poder utilizar o seu novo device voce vai precisar particiona-lo, para isso execute:
# disklabel -r -w ccd0c auto
O comando acima, ira criar uma unica partição /dev/ccd0c contendo todo o espaço util do seu device ccd, se voce quiser dividi-lo em varias partiçoes será necessario utilizar o comando:
# disklabel -e ccd0c
- Formatando CCD
Apos o uso do disklabel seu o device /dev/ccd0c esta pronto para ser formatado, para isso execute o comando:
# newfs /dev/ccd0c
Observação:
- Nos exemplos acima de uso do ccdconfig, usamos um interleave de 128 blocos com 512 bytes cada.
- Se voce perder um disco de um stripe CCD voce ira perder os dados, a menos que voce esteja usando a opção de Mirror.
- Se voce precisa de uma solução que implemente RAID5, sugiro o uso do vinum.
Boa sorte!
Edson