terça-feira, 16 de outubro de 2018

Testes de desempenho de I/O no Linux usando o comando dd



No Linux, o comando dd pode ser usado para medir o desempenho de I/O em disco utilizando escritas sequenciais. Este artigo fornecerá informações sobre quais parâmetros devem ser utilizados.


Noções básicas

dd pode ser usado para cópia de dados de baixo nível. Ao fazer isso, arquivos de dispositivos são acessados diretamente. Cuidado com o fato de que o uso incorreto do dd pode levar rapidamente à perda de dados. É recomendável executar as etapas descritas abaixo com muita atenção. Se o dd for utilizado incorretamente, o resultado será perda de dados.

Medindo o desempenho de gravação

Sistemas Operacionais modernos normalmente não gravam arquivos diretamente em sistemas de RAID ou discos rígidos. A memória temporaria que não está em uso no momento, será usada para armazenar em cache gravações e leituras.

Assim, essa medida de desempenho de I/O não será afetada por esses caches (memória temporaria),  o parâmetro oflag pode ser usado. Assim, os dois flags a seguir são interessantes (para detalhes, consulte dd --help e dd utilizando I/O direto ou sincronizado).

  • direct (utiliza I/O direto para dados)
  • dsync (utiliza I/O sincronizado para dados)
  • sync (da mema forma, mas também para metadados)
Para medir o desempenho de gravação, os dados a serem escritos devem ser lidos de /dev/zero e depois gravados em um RAID, disco rígido ou uma partição vazia (usando algo como of=/dev/sda para o primeiro disco rígido, ou of=/dev/sda2 para uma segunda partição no primeiro disco rígido. Se isso não for possível, uma file system normal pode ser utilizada (usando algo como of=/root/teste.img). Por razões de segurança se não tiverem certeza do que estão fazendo, faça os testes em um arquivo dentro da file system. No meu caso vou fazer os testes em discos raw e file system para comparação. O desempenho de gravação obtido nos testes com arquivos em file system será um pouco mais lento (porque os metadados também serão gravados no sistema de arquivo).

Importante: Ao gravar em um dispositivo (algo como /dev/sda), os dados armazenados serão perdidos. Por essa razão, escolha um RAID, disco ou partição vazia.

Nos meus testes estarei utilizando o seguinte equipamento: 
  • HP EliteBook 8460w
    • 8 GiB de RAM
    • sda (SSD)
    • sdb (SATA)
Observação:
  • Quando usar if=/dev/zero and bs=1G, o Linux precisará de 1GiB de espaço livre em memoria RAM. Se o seu ambiente de teste não tiver memória livre o suficiente, utilize um valor menor para o parâmetro bs (algo como 512MiB).
  • A fim de obter resultados mais próximos da realidade do nosso dia-a-dia, recomendo realizar os testes descritos varias vezes (tres a dez vezes, por exemplo). Ao fazer isso poderá detectar variações isoladas. Tais variações isoladas pode incluir jobs no cron, interrupções ou condições gerais devido ao processamento paralelo, o que pode afetar gravemente o desempenho. Um exemplo ao extremo, para esclarecermos essa questão, seria um job executando uma store procedure onde a mesma poderia estar fazendo muitos inserts em um banco de dados. 
HP Elite Book 8460w

Neste exemplo, nosso teste vai escrever um arquivo em /tmp , sendo a file system um XFS e SATA 5400 RPM.

1 GiB será escrito no arquivo /tmp/teste.img, primeiro com o cache ativado

merlin:/ # hdparm -W1 /dev/sdb

/dev/sdb:
 setting drive write-caching to 1 (on)
 write-caching =  1 (on)
merlin:/ # dd if=/dev/zero of=/tmp/teste.img bs=1G count=1 oflag=direct
1+0 registros de entrada
1+0 registros de saída
1073741824 bytes (1,1 GB, 1,0 GiB) copiados, 9,96763 s, 108 MB/s
merlin:/ # 

agora com o cache desativado

merlin:/ # hdparm -W0 /dev/sdb

/dev/sdb:
 setting drive write-caching to 0 (off)
 write-caching =  0 (off)
merlin:/ # dd if=/dev/zero of=/tmp/teste.img bs=1G count=1 oflag=direct
1+0 registros de entrada
1+0 registros de saída
1073741824 bytes (1,1 GB, 1,0 GiB) copiados, 10,0717 s, 107 MB/s
merlin:/ # 

Nesse teste vamos ver a latência, 512 bytes serão escritos 1000 vezes, primeiro com o cache desativado.

merlin:/ # hdparm -W0 /dev/sdb

/dev/sdb:
 setting drive write-caching to 0 (off)
 write-caching =  0 (off)
merlin:/ # dd if=/dev/zero of=/tmp/teste.img bs=512 count=1000 oflag=direct
1000+0 registros de entrada
1000+0 registros de saída
512000 bytes (512 kB, 500 KiB) copiados, 11,7722 s, 43,5 kB/s
merlin:/ # 

agora com o cache ativado

merlin:/ # hdparm -W1 /dev/sdv

/dev/sdb:
 setting drive write-caching to 1 (on)
 write-caching =  1 (on)
merlin:/ # dd if=/dev/zero of=/tmp/teste.img bs=512 count=1000 oflag=direct
1000+0 registros de entrada
1000+0 registros de saída
512000 bytes (512 kB, 500 KiB) copiados, 0,0947568 s, 5,4 MB/s
merlin:/ # 

Agora teste feito no disco SSD

cache ativado
merlin:/ # hdparm -W1 /dev/sda

/dev/sda:
 setting drive write-caching to 1 (on)
 write-caching =  1 (on)
merlin:/ # dd if=/dev/zero of=/opt/teste.img bs=1G count=1 oflag=direct
1+0 registros de entrada
1+0 registros de saída
1073741824 bytes (1,1 GB, 1,0 GiB) copiados, 2,09522 s, 512 MB/s

merlin:/ # 

 cache desativado
merlin:/ # hdparm -W0 /dev/sda

/dev/sda:
 setting drive write-caching to 0 (off)
 write-caching =  0 (off)
merlin:/ # dd if=/dev/zero of=/opt/teste.img bs=1G count=1 oflag=direct
1+0 registros de entrada
1+0 registros de saída

1073741824 bytes (1,1 GB, 1,0 GiB) copiados, 2,11989 s, 507 MB/s

Latencia, cache ativado
merlin:/ # hdparm -W1 /dev/sda

/dev/sda:
 setting drive write-caching to 1 (on)
 write-caching =  1 (on)
merlin:/ # dd if=/dev/zero of=/opt/teste.img bs=512 count=1000 oflag=direct
1000+0 registros de entrada
1000+0 registros de saída
512000 bytes (512 kB, 500 KiB) copiados, 0,0521671 s, 9,8 MB/s

merlin:/ # 

Latência, cache desativado
merlin:/ # hdparm -W0 /dev/sda

/dev/sda:
 setting drive write-caching to 0 (off)
 write-caching =  0 (off)
merlin:/ # dd if=/dev/zero of=/opt/teste.img bs=512 count=1000 oflag=direct
1000+0 registros de entrada
1000+0 registros de saída
512000 bytes (512 kB, 500 KiB) copiados, 1,29057 s, 397 kB/s

merlin:/ # 

Nenhum comentário:

Postar um comentário