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:/ #
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:/ #
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:/ #
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:/ #
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:/ #