http://www.zago.eti.br/hdparm-apostila.txt veja também: http://www.zago.eti.br/menu.html http://www.zago.eti.br/hdparm.txt -> FAQ sobre o hdparm http://www.zago.eti.br/cdr.txt -> FAQ sobre CDR/W http://www.zago.eti.br/hd.txt -> FAQ sobre HD Este documento foi enviado em 19/11/2003 Por: _____________________________________________________________________ Rogério S. Ferreira. Linux User #317922 ICQ #89153586 r.s.ferreira@bol.com.br _____________________________________________________________________ /************************************************************************** MELHORANDO O DESEMPENHO DO LINUX COM HDPARM POR Rogério Ferreira e-mail: r.s.ferreira@bol.com.br icq: 89153586 **************************************************************************/ Bem pessoal, aqui estou eu mais uma vez para tentar trocar algumas informações com aqueles que estiverem interessados em aprender mais um pouco sobre seu próprio computador e sobre linux. O hdparm é uma ferramenta do Linux que serve para ajustar os parâmetros do HD, possibilitando a utilização do mesmo com todos os recursos disponíveis e atingindo taxas de transferência realmente significativas. Antes de mais nada, gostaria de esclarecer algumas coisas. O Linux, assim como o Windows, por motivos de segurança e compatibilidade, mantém por padrão na sua instalação os discos da máquina com as configurações mínimas, sendo necessário que o usuário faça os devidos ajustes para que o sistema obtenha o melhor desempenho do hardware. A grande diferença entre o Linux e o Windows é que, quando você equece de habilitar as configurações do seu hd no Linux, o sistema fica muito lento, parecendo até que você está utilizando um velho HD de 500 mb, porém, quando você deixa de instalar o driver da controladora de disco no Windows, além do sistema ficar muito lento, toda vez que você utiliza algum programa que faça um granade acesso ao disco (defrag, scandisk, ou quando abrir um programa pesado qualquer) ocorrem alguns problemas como o travamento do cursor do mouse ou até mesmo o travamento de todo o sistema, tendo que reiniciar o computador para resolver o problema. Vamos então verificar como se encontra a configuração atual do HD com o comando abaixo: Lembrem-se, todos os comandos devem ser utilizados como ROOT!!! #/sbin/hdparm /dev/hda (altere a última letra conforme a posição do seu HD) Primário master = /dev/hda Primário slave = /dev/hdb Secundário master = /dev/hdc Secundário slave = /dev/hdd A saida do comando acima é a seguinte: /dev/hda: multcount = 8 (on) IO_support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 7476/255/63, sectors = 120103200, start = 0 Podemos perceber claramente que as diversas configurações do HD estão desabilitadas. Por exemplo a opção IO_support (I/O) está configurada para o valor padrão (default 16-bit) e a opção using_dma (PIO, DMA ou UDMA) está desabilitada, o que torna o desempenho muito inferior do esperado. A mesma coisa acontece com o segundo HD, veja no comando abaixo: #/sbin/hdparm /dev/hdb /dev/hdb: multcount = 8 (on) IO_support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 2431/255/63, sectors = 39062500, start = 0 A primeira providência a ser tomada antes da configuração é saber exatamente quais são as características do seu hardware, pois algumas destas configurações feitas de forma errada podem causar-lhe muitos transtornos. Para obtermos as informações necessárias para a configuração dos discos devemos utilizar o seguinte comando: #/sbin/hdparm -i /dev/hda No caso do HD ATA 133, 7200 rpm, o resultado do comando citado acima é o seguinte: /dev/hda: Model=Maxtor 6Y060L0, FwRev=YAR41BW0, SerialNo=Y2MLSP3E Config={ Fixed } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=57 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=8 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=120103200 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 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 udma6 AdvancedPM=yes: disabled (255) WriteCache=enabled Drive conforms to: (null): 1 2 3 4 5 6 7 Ai você deve estar me perguntando, o que isto tem que possa me interessar? Nestas informações tem o que eu considero mais importante, o modo de UDMA máximo que eu posso aplicar para o meu HD. Veja as seguintes linhas: PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: *mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 udma6 A terceira linha indica que o meu HD suporta UDMA e que aceita udma6, ou seja, aceita a configuração para ATA 133. (lembre-se que para HDs ATA, essa configuração só deverá ser feita se o mesmo estiver usando o cabo apropriado de 80 vias) Outra informação importante que este comando nos fornece é o que podemos ver na seguinte linha: BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=8 MaxMultSect nos informa a configuração máxima para o MultSect, ou seja, nós estamos com a configuração de MultSect com o valor 8 mas podemos configurá-lo para 16 sem problemas. (irei explicar o que esta configuração faz mais adiante) Vejamos agora mais um exemplo, um HD ATA 100, 5400 rpm e suas configurações de acordo com o comando abaixo: #/sbin/hdparm -i /dev/hdb /dev/hdb: Model=Maxtor 2B020H1, FwRev=WAH21PB0, SerialNo=B1DT8P7E Config={ Fixed } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=57 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=8 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=39062500 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 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 AdvancedPM=yes: disabled (255) WriteCache=enabled Drive conforms to: ATA/ATAPI-6 T13 1410D revision 0: 1 2 3 4 5 6 Conforme visto anteriormente, podemos determinar qual o modo DMA máximo suportado pelo dispositivo: PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: *mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 Podemos ver que o dispositivo suporta UDMA, sabemos ainda que o máximo suportado neste caso é o udma5, ou seja, ATA 100, podemos ver ainda, que conforme o primeiro HD sua configuração máxima de MultSect é 16, porém, o mesmo está configurado para 8. Repare ainda que na linha DMA modes há um "*" em mdma0, o que significa que neste momento o HD está configurado para trabalhar nete modo e não como ATA 100 (udma5) como era esperado. Antes de começarmos a tratar da configuração propriamente dita, vamos efetuar os testes de desempenho para que possamos comparar o nosso ganho de performance. Para realizar os teste devemos utilizar o seguinte comando: #/sbin/hdparm -Tt /dev/hda /dev/hda: Timing buffer-cache reads: 128 MB in 0.32 seconds =400.00 MB/sec Timing buffered disk reads: 64 MB in 26.92 seconds = 2.38 MB/sec #/sbin/hdparm -Tt /dev/hdb /dev/hdb: Timing buffer-cache reads: 128 MB in 0.32 seconds =400.00 MB/sec Timing buffered disk reads: 64 MB in 24.34 seconds = 2.63 MB/sec Os testes acima nos mostram duas velocidades, sendo que a primeira (Timing buffer-cache reads) indica a velocidade de acesso da memória cache do disco, e a segunda (Timing buffered disk reads) indica a velocidada real de leitura do disco. Podemos reparar ainda que mesmo sendo dois HDs com características bastante diferentes (hda ATA 133, 7200 rpm e hdb ATA 100, 5400 rpm), os resultados dos testes apresentam praticamente o mesmo resultado. Agora que já realizamos os testes de desempenho e que temos em mãos os dados mais importantes, pois com a configuração de DMA errada você pode causar diversos problemas de perda de dados ou até mesmo corrupção do sistema de arquivo, podemos começar a tratar diretamente da configuração do HD. As "flags" que eu considero mais importantes para a configuração são as seguintes: -A Esta flag serve para configurar a opção "readahead", que torna possível a leitura prévia dos setores seguintes do disco. Suas opções são (0) desabilitada e (1) habilitada. -W Esta opção configura o "write-caching", ou seja, a utilização da memória cache do seu disco. Para habilitar este parâmetro verifique no comando hdparm -i se o seu HD possui a informação de "BuffType" ou "BuffSize", o que indica que seu disco possui memória cache. Suas opções são (0) desabilitada e (1) habilitada. -c Esta flag ativa a utilização do suporte a I/O "IO_support", aumentando a performance do disco e reduzindo a utilização da CPU na transferência de dados. Suas opções são (0) desabilitada, (1) I/O 32-bit e (3) I/O 32-bit sync, esta última opção permite a transferência de dados sincronizada (opção mais segura para máquinas de alto desempenho como servidores de banco de dados, porém um pouco mais lenta que a opção 1). -d Esta opção serve para configurar a ativação do uso da DMA "using_dma" (configura apenas o uso e não o tipo), possibilitando o acesso direto do disco à memória do computador. Suas opções são (0) desabilitada e (1) habilitada. -a Esta flag determina a quantidade de setores que o disco deverá ler antecipadamente com a opção "readahead", esta opção aumenta a performance do sistema de arquivos em leituras sequenciais de arquivos grandes, porém como o Linux é basicamente composto de arquivos pequenos, caso você não necessite utilizar algum banco de dados muito grande, sugiro utilizar o valor encontrado em MaxMultSect, que no meu caso é 16. Não utilize esta flag sem estar com a flag -A habilitada. -m Esta opção permite a configuração de transferência de múltiplos setores por interrupção de I/O entre o disco e a controladora "multcount", aumentando desta forma a velocidade da transmissão de dados. Devemos utilizar para esta flag o valor encontrado em MaxMultSect, no meu caso 16, conforme encontrado com o comando hdparm -i no início desta apostila. Não utilize esta flag sem estar com a flag -c (I/O) devidamente habilitada. -u Esta flag serve para configurar a ativação da opção "unmaskirq", o que possibilita uma melhora no desempenho do sistema, possibilitando um melhor controle sobre as interrupções do mesmo durante o uso do disco. Suas opções são (0) desabilitada e (1) habilitada. -X Esta flag é a mais complicada e perigosa de todas, pois ela é a responsável pela configuração do tipo de acesso DMA que será utilizado pelo disco. Foi para esta configuração que nós utilizamos o comando hdparm -i no início da apostila, para saber qual o tipo de DMA máximo suportado pelo HD. Para saber qual o valor utilizar na configuração do tipo de DMA existe a seguinte regra: para o modo pio o número inicial é 8, ou seja, para pio3 deve-se utilizar 8 + 3 = 11; para o modo mdma o número inicial é 32, seguindo a mesma regra, para o mdma1 deve-se utilizar 32 + 1 = 33 e para o modo udma o número inicial é 64, ou seja, para o udma5 deve-se utilizar 64 + 5 = 69. Para facilitar a configuração utilize a seguinte tabela: MODO DMA VALOR A SER UTILIZADO default 00 pio0 08 pio1 09 pio2 10 pio3 11 pio4 12 mdma0 32 mdma1 33 mdma2 34 udma0 64 udma1 65 udma2 66 udma3 67 udma4 68 udma5 69 udma6 70 Para a utilização desta flag, você deve estar com a opção -d habilitada. Agora que já vimos para que servem as principais flags do hdparm, podemos utilizá-las para configurarmos os discos. Na configuração do primeiro HD (ATA 133), utilizei os segintes parâmetros: #/sbin/hdparm -A1 -W1 -c1 -d1 -a16 -m16 -u1 -X70 /dev/hda /dev/hda: setting fs readahead to 16 setting 32-bit IO_support flag to 1 setting multcount to 16 setting unmaskirq to 1 (on) setting using_dma to 1 (on) setting xfermode to 70 (UltraDMA mode6) setting drive read-lookahead to 1 (on) setting drive write-caching to 1 (on) multcount = 16 (on) IO_support = 1 (32-bit) unmaskirq = 1 (on) using_dma = 1 (on) readahead = 16 (on) Para a configuração do segundo HD (ATA 100), utilizei os seguintes parâmetros: #/sbin/hdparm -A1 -W1 -c1 -d1 -a16 -m16 -u1 -X69 /dev/hdb /dev/hdb: setting fs readahead to 16 setting 32-bit IO_support flag to 1 setting multcount to 16 setting unmaskirq to 1 (on) setting using_dma to 1 (on) setting xfermode to 69 (UltraDMA mode5) setting drive read-lookahead to 1 (on) setting drive write-caching to 1 (on) multcount = 16 (on) IO_support = 1 (32-bit) unmaskirq = 1 (on) using_dma = 1 (on) readahead = 16 (on) Após serem feitas todas as configurações, podemos fazer novmente o teste de desempenho para que possamos verificar se conseguimos algum ganho de velocidade com as configurações feitas. #/sbin/hdparm -Tt /dev/hda /dev/hda: Timing buffer-cache reads: 128 MB in 0.30 seconds =426.67 MB/sec Timing buffered disk reads: 64 MB in 1.27 seconds = 50.39 MB/sec #/sbin/hdparm -Tt /dev/hdb /dev/hdb: Timing buffer-cache reads: 128 MB in 0.32 seconds =400.00 MB/sec Timing buffered disk reads: 64 MB in 1.71 seconds = 37.43 MB/sec Com este teste de desempenho podemos constatar que a velocidade de leitura de dados do HDA (ATA 133) passou de 2.38 MB/sec para 50.39 MB/sec, ou seja, seu desempenho passou a ser aproximadamente 21 vezes maior que no teste anterior e que a velocidade de acesso do HDB (ATA 100) passou de 2.63 MB/sec para 37.43 MB/sec, aproximadamente 14 vezes maior que o primeiro teste. Estas configurações do hdparm só apresentam resultado na seção atual, ou seja, toda vez que você desligar o computador as configurações voltarão a ser como eram antes. Para resolver este problema, após descobrir qual a melhor configuração para os seus discos, acrescente as linhas de configuração do hdparm no final do arquivo /etc/rc.d/rc.local, desta forma o comando de configuração será executado toda vez que você ligar o computador. Gostaria de deixar bem claro que estes são apenas alguns parâmetros que eu utilizo no meu computador, porém existem vários outros parâmetros que você pode utilizar para melhorar a sua configuração e até mesmo torná-la melhor que a minha, porém faça isso com cuidado pois se você passar para o hdparm parâmetros que o seu HD não suporte você poderá perder todo o conteúdo do seu sistema de arquivos. Para maiores informações leia a página de manual do hdparm ou entre em contato por: e-mail: r.s.ferreira@bol.com.br icq: 89153586