Otimizando seu Linux com HDParm

Então você compilou o kernel do seu Linux, e acha que já fez de tudo para melhorar a otimização dele? Errado.

Nesse artigo, eu estarei apresentando um aplicativo genial, que pode melhorar muita a performance de leitura/escrita do de um disco rígido: o hdparm.

O hdparm funciona apenas em discos IDE, o que provavelmente deve ser o seu caso. Para usá-lo, você vai precisar saber algumas propriedades do disco rígido, pois o hdparm não lhe fornecerá nenhuma informação nesse sentido, pelo contrário: ele espera que você forneça esse detalhes.

Um outro detalhe interessante que vale a pena ser citado, é que quanto maiores facilidades/capacidade o disco IDE possuir (em outras palavras, quanto mais novo) melhores serão os resultados. Você pode dobrar, triplicar e em alguns casos até obter uma performance de 6 à 10 vezes a encontrada originalmente, antes da aplicação do hdparm.

Bem, como nem tudo são flores, sou obrigado a dizer que você deve usar o hdparm com extrema cautela. Se você passar parâmetros de configuração para o hdparm que exceda a capacidade do disco ou da placa mãe, o hdparm não irá checar isso, e você correrá o risco de ter a máquina travada, ou pior, ter corrupção dos dados presentes neste disco. Então, antes de mais nada, faça backup dos dados!


A propósito, se os termos técnicos te assustaram um pouco (talvez muito), não se preocupe, eu vou apresentar uma curta explicação do que eles siginificam mais à frente. Entretanto, entender o básico da estrutura de um computador vai lhe ajudar bastante também.

Como obter dados sobre o disco rígido

Claro, se você tiver a sorte de ter um manual do fabricante ou conhecer o hardware da máquina, então você pode se dar por felizardo e pular essa parte. Caso contrário, vamos em frente.

  1. A maneira correta
  2. Você só precisa executar um:

    #hdparm -i /dev/hda
    
    /dev/hda:
    
     Model=WDC WD100EB-00CSF0, FwRev=04.01B04, SerialNo=WD-WMAAV1614979
     Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
     RawCHS=16383/16/63, TrkSize=57600, SectSize=600, ECCbytes=40
     BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=16
     CurCHS=16383/16/63, CurSects=-66060037, LBA=yes, LBAsects=19541088
     IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
     PIO modes: pio0 pio1 pio2 pio3 pio4 
     DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 
     AdvancedPM=no
     Drive Supports : Reserved : ATA-1 ATA-2 ATA-3 ATA-4 ATA-5 
    

    Trocando o /dev/hda pelo disco que você estiver usando. Esse comando irá consultar o drive do disco rígido que está sendo usado, portanto fornecerá todas as informações que você vier a precisar.

  3. Usando a BIOS do computador.
  4. Este pode ser um método sofrível de obter informações sobre o HD. Durante o boot da máquina, a BIOS terá os dados armazenados sobre os discos rígidos desde a primeira vez que fez um reconhecimento nos mesmos. O que significa que ela sabe (torcemos para que sim !) com o que está lidando. Mas isso não quer dizer que ela vai lhe dar todas as informações de maneira clara. Isto pode variar de fabricante para fabricante.

  5. Recolhendo informações da mensagem de boot da máquina
  6. Se você tiver memória fotográfica, paciência ou uma câmera, você pode coletar informações sobre o hd durante o boot da máquina. Claro, novamente você está dependendo da BIOS. Então cruze os dedos ...

  7. Indo ao site do fabricante
  8. Essa me parece a melhor forma. Ninguém melhor do que fabricante para lhe fornecer esses dados exatos. Alguns ainda fornecem ferramentas, normalmente discos de boot, que você pode baixar e testar seu hd.

  9. Procurando ajuda em listas de discussão

Bem, esse é um procedimento bastante básico para alguém que tem dúvidas sobre Linux, mas vale a pena citar, pois alguns modelos/fabricantes de HD são muito populares, então a possibilidade de você encontrar alguém com o mesmo modelo que o seu pode ser grande.

Iniciando os testes de benchmark

O primeiro passo para começarmos é verificar a quanto de velocidade o HD está funcionando. O Hdparm possui capacidade de realizar estes testes, para isso execute o comando assim:

#hdparm -Tt /dev/hda

A opção T irá testar o cache da memória, CPU e o buffer. A opção t irá mostrar resultados de leitura diretamente no disco, não no cache. Usando as duas opções e executando o comando várias vezes, você vai ter uma idéia de como está a perfomance do disco. Lembrando que /dev/hda é apenas um exemplo, isso pode ser executado com /dev/hdb, ou /dev/hdc ou onde estiver o HD.
Para apresentar resultados práticos, eu usei uma máquina com Pentium 233 Mhz, 76 Mhz de RAM, com um HD Quantum Fireball.
#hdparm -Tt /dev/hda
/dev/hda:
Timing buffer-cache reads: 128 MB in 4.73 seconds = 27.06 MB/sec Timing buffered disk reads: 64 MB in 21.18 seconds = 3.02 MB/sec

Parece bastante lento para mim. Vamos checar como o Linux está usando este HD:

#hdparm /dev/hda

/dev/hda:
 multcount    =  0 (off)
 I/O support  =  0 (default 16-bit)
 unmaskirq    =  0 (off)
 using_dma    =  0 (off)
 keepsettings =  0 (off)
 nowerr       =  0 (off)
 readonly     =  0 (off)
 readahead    =  8 (on)
 geometry     = 1023/64/63, sectors = 4124736, start = 0
 

Credo, temos algo de errado aqui! Meu hardware pemite, por exemplo, o uso de DMA (Direct Memory Access), mas olhando o quadro acima, é possível ver que essa opção está desligada. E o ítem I/O Support está usando parâmetros para 386! Minha máquina é 32 bits ora!
Bem, temos alguns erros, então vamos entender os ítens mostrados acima, para tomarmos algumas atitudes:

Então eu habilitei o uso de DMA. Veja o resultado:

#hdparm -d 1 /dev/hda

/dev/hda:
 Timing buffer-cache reads:   128 MB in  5.42 seconds = 23.62 MB/sec
 Timing buffered disk reads:  64 MB in 14.92 seconds =  4.29 MB/sec

Melhorou não? Pelo menos o segundo ítem. Mas podemos tentar mais coisas. Aliás, a menos que alguém lhe cante a bola, você terá que experimentar algumas vezes, até atingir algo bom. Eu no caso, parei enquanto as configurações estavam dentro de um limite de risco aceitável. Veja o que fiz, e o resultado:

#hdparm -m 8 -d 1 -X34 -a 16 /dev/hda

/dev/hda:
 multcount    =  8 (on)
 I/O support  =  1 (32-bit)
 unmaskirq    =  0 (off)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 nowerr       =  0 (off)
 readonly     =  0 (off)
 readahead    =  8 (on)
 geometry     = 1023/64/63, sectors = 4124736, start = 0
#hdparm -Tt /dev/hda

/dev/hda:
 Timing buffer-cache reads:   128 MB in  4.82 seconds = 26.56 MB/sec
 Timing buffered disk reads:  64 MB in  7.09 seconds =  9.03 MB/sec


A moral da história é que essa não é necessariamente a melhor configuração. É apenas um exemplo. Se você tiver tempo e condições para lidar com os riscos, pode ir mais a fundo, e encontrar configurações mais, ahn, "pra macho".
E procure realmente fazer backup e ler a manpage do hdparm. Há muitos mais detalhes lá do que expliquei aqui.
  1. Não se amedronte com os comandos. Eles podem parecer complicados, mas só passando os parâmetros informados pela opção -i do hdparm já lhe trará bons resultados
  2. Eu andei fazendo testes com os tipos de partição EXT3 e ReiserFS, os sistemas de arquivo com Journaling mais usados no Linux. Os resultados com o EXT3 foram satisfatórios, mas com o ReiserFS não, inclusive eu travei a máquina de testes usando a opção -X do hparm. Conclusão: utilize o hdparm para partições com EXT3 e deixe para lá se for ReiserFS. De qualquer modo, ambas são mais rápidas que o EXT2, em especial o ReiserFS.

Voltar