Como verificar o desempenho do disco rígido


Respostas:


425

Método terminal

hdparm é um bom lugar para começar.

sudo hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads:   12540 MB in  2.00 seconds = 6277.67 MB/sec
Timing buffered disk reads: 234 MB in  3.00 seconds =  77.98 MB/sec

sudo hdparm -v /dev/sda também dará informações.

dd fornecerá informações sobre velocidade de gravação.

Se a unidade não tiver um sistema de arquivos (e somente então ), use of=/dev/sda.

Caso contrário, monte-o em / tmp e escreva e exclua o arquivo de saída de teste.

dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output

10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 1.08009 s, 77.7 MB/s

Método gráfico

  1. Vá para Sistema -> Administração -> Utilitário de Disco.
    • Como alternativa, inicie o utilitário de disco do Gnome na linha de comando executando gnome-disks
  2. Selecione seu disco rígido no painel esquerdo.
  3. Agora clique no botão "Benchmark - Measure Drive Performance" no painel direito.
  4. Uma nova janela com gráficos é aberta. Você encontrará dois botões. Um é para "Iniciar Referência Somente Leitura" e outro é "Iniciar Referência / Leitura / Gravação". Quando você clica em qualquer botão, ele inicia o benchmarking do disco rígido.

teste

Como comparar E / S de disco

Artigo

Há algo mais que você quer?


10
Eu recomendaria testes /dev/urandome /dev/zeroentradas para ddtestar um SSD, pois a compressibilidade dos dados pode ter um efeito maciço na velocidade de gravação.
Ian Mackinnon

3
Não existe esse "Sistema ->" no meu Ubuntu 12.04 Unity. Ou pelo menos eu não encontrei. E eu não vejo isso da ferramenta de disco nem dentro Configurações do sistema ... O_o Mas eu finallly conseguiu executá-lo: / usr / bin / palimpsesto
Fran Marzoa

6
Observe que, desde a 12.10, ele é simplesmente chamado de Discos e pode ser encontrado no Unity.
Paul Lammertsma

1
No Gnome, isso mudou para Aplicativos -> Ferramentas do sistema -> Preferências -> Utilitário de disco. Para aqueles de uso que odeiam a unidade.
Ken afiada

2
Atualmente, o /tmpsistema de arquivos está usando um ramdisk. Portanto, escrever para /tmpparece estar testando sua memória, não seu subsistema de disco.
Zoredache

99

Suominen está certo, devemos usar algum tipo de sincronização; mas existe um método mais simples, conv = fdatasync fará o trabalho:

dd if=/dev/zero of=/tmp/output conv=fdatasync bs=384k count=1k; rm -f /tmp/output
1024+0records in
1024+0 records out
402653184 bytes (403 MB) copied, 3.19232 s, 126 MB/s

28
É uma resposta usando um comando / opção diferente dos outros. Vejo que é uma resposta digna de um post próprio.
Alaa Ali

2
Por que você usou 384k como tamanho de bloco?
Diego F. Durán

1
@ Diego Não há razão. Foi só um exemplo. Você pode usar qualquer outra coisa. (entre cerca de 4k ... 1M) É claro que um tamanho de bloco maior proporcionará melhor desempenho. E, é claro, diminua o número de contagem quando você usar bs grandes, ou isso levará um ano para terminar.
Tele

não é confiável por ferramentas de marca de banco como números iozone e sysbench são muito muito menor
MSS

1
Tenha cuidado com o uso de zeros para os seus dados de escrita - alguns sistemas de arquivos e discos terão um caminho especial caso para ele (e outros dados compressíveis), que fará com que artificialmente elevados números de referência ...
Anon

50

Eu não recomendaria usar /dev/urandomporque é baseado em software e lento como porco. Melhor usar um pedaço de dados aleatórios no ramdisk. No teste do disco rígido, o acaso não importa, porque cada byte é gravado como está (também no ssd com dd). Mas se testarmos o pool zfs desduplicado com zero puro ou dados aleatórios, haverá uma enorme diferença de desempenho.

Outro ponto de vista deve ser a inclusão do tempo de sincronização; todos os sistemas de arquivos modernos usam cache nas operações de arquivo.

Para realmente medir a velocidade do disco e não a memória, precisamos sincronizar o sistema de arquivos para se livrar do efeito do cache. Isso pode ser feito facilmente por:

time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k && sync"

com esse método, você obtém saída:

sync ; time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k  && sync" ; rm testfile 
1024+0 records in
1024+0 records out
104857600 bytes (105 MB) copied, 0.270684 s, 387 MB/s

real    0m0.441s
user    0m0.004s
sys 0m0.124s

então o datarate do disco é apenas 104857600 / 0,441 = 237772335 B / s -> 237MB / s

Isso é mais de 100 MB / s menor do que com o cache.

Benchmarking feliz,


3
Tenha cuidado ao usar zeros para seus dados de gravação - alguns discos (como SSDs) e alguns sistemas de arquivos terão um caminho especial para isso. Isso resulta em números de referência artificialmente altos ao usar zero buffers. Outros padrões de dados altamente compressíveis também pode distorcer resultados ...
Anon

36

Se você deseja monitorar a velocidade de leitura e gravação do disco em tempo real, pode usar a ferramenta iotop .

Isso é útil para obter informações exatas sobre o desempenho de um disco para um aplicativo ou tarefa em particular. A saída mostrará a velocidade de leitura / gravação por processo e a velocidade total de leitura / gravação para o servidor, muito semelhante à top.

Para instalar o iotop:

sudo apt-get install iotop  

Para executá-lo:

sudo iotop

28

Se você quer precisão, você deve usar fio. Requer a leitura do manual ( man fio), mas fornecerá resultados precisos. Observe que, para qualquer precisão, você precisa especificar exatamente o que deseja medir. Alguns exemplos:

Velocidade de leitura sequencial com blocos grandes (isso deve ser próximo ao número que você vê nas especificações para sua unidade):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=read --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Velocidade de gravação seqüencial com blocos grandes (isso deve ser próximo ao número que você vê nas especificações para sua unidade):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=write --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

QD1 de leitura aleatória em 4K (este é o número que realmente importa para o desempenho no mundo real, a menos que você saiba com certeza):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Leitura aleatória mista de 4K e gravação de QD1 com sincronização (este é o pior número esperado da sua unidade, geralmente menos de 1% dos números listados na folha de especificações):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Aumente o --sizeargumento para aumentar o tamanho do arquivo. O uso de arquivos maiores pode reduzir os números obtidos, dependendo da tecnologia e do firmware da unidade. Arquivos pequenos fornecerão resultados "muito bons" para mídia rotacional porque o cabeçote de leitura não precisa se mover muito. Se o seu dispositivo estiver quase vazio, usar um arquivo grande o suficiente para quase encher a unidade fornecerá o pior comportamento possível para cada teste. No caso de SSD, o tamanho do arquivo não importa muito.

No entanto, observe que, para algumas mídias de armazenamento, o tamanho do arquivo não é tão importante quanto o total de bytes gravados durante um curto período de tempo. Por exemplo, alguns SSDs podem ter um desempenho significativamente mais rápido com blocos pré-apagados ou podem ter uma pequena área de flash do SLC usada como cache de gravação e o desempenho muda quando o cache do SLC está cheio. Como outro exemplo, os HDDs da Seagate SMR têm cerca de 20 GB de área de cache PMR com desempenho bastante alto, mas, quando ficar cheio, gravar diretamente na área SMR pode reduzir o desempenho para 10% do original. E a única maneira de ver essa degradação do desempenho é primeiro escrever mais de 20 GB o mais rápido possível. Obviamente, tudo isso depende da sua carga de trabalho: se o acesso de gravação estiver cheio de atrasos prolongados que permitem que o dispositivo limpe o cache interno, sequências de teste mais curtas refletirão melhor seu desempenho no mundo real. Se você precisar fazer muito IO, precisará aumentar os dois--io_sizee --runtimeparâmetros. Observe que algumas mídias (por exemplo, a maioria dos dispositivos flash) terão desgaste extra com esses testes. Na minha opinião, se algum dispositivo é ruim o suficiente para não lidar com esse tipo de teste, ele não deve ser usado para armazenar dados valiosos em nenhum caso.

Além disso, alguns dispositivos SSD de alta qualidade podem ter algoritmos de nivelamento de desgaste ainda mais inteligentes, em que o cache SLC interno tem inteligência suficiente para substituir os dados que estão sendo reescritos durante o teste se atingir o mesmo espaço de endereço (ou seja, arquivo de teste é menor que o cache total do SLC). Para esses dispositivos, o tamanho do arquivo começa a importar novamente. Se você precisar da sua carga de trabalho real, é melhor testar com tamanhos de arquivo que você realmente verá na vida real. Caso contrário, seus números podem parecer bons demais.

Observe que fiocriará o arquivo temporário necessário na primeira execução. Ele será preenchido com dados aleatórios para evitar obter números muito bons de dispositivos que trapaceiam compactando os dados antes de gravá-los no armazenamento permanente. O arquivo temporário será chamado fio-tempfile.datnos exemplos acima e armazenado no diretório de trabalho atual. Portanto, você deve primeiro mudar para o diretório que está montado no dispositivo que deseja testar.

Se você tem um bom SSD e deseja ver números ainda mais altos, aumente --numjobsacima. Isso define a simultaneidade para as leituras e gravações. Todos os exemplos acima foram numjobsconfigurados para 1que o teste seja sobre leitura e gravação de processo único de encadeamento (possivelmente com uma fila configurada com iodepth). Os SSDs de ponta (por exemplo, Intel Optane) devem obter números altos mesmo sem aumentar numjobsmuito (por exemplo, 4devem ser suficientes para obter os números de especificação mais altos), mas alguns SSDs "corporativos" precisam de 32- 128para obter os números de especificação porque a latência interna desses dispositivos é maior, mas a taxa de transferência geral é insana.


1
Acabei de testar novamente alguns dispositivos. Usando o teste de leitura sequencial acima (tamanho de bloco de 2 MB), obtive 280 MB / s do Samsung SSD 850 EVO e 1070 MB / s do Intel 910 SSD. Com tamanho de bloco de 64k e linha de comando idêntica, obtive 268 MB / s do 850 EVO e 1055 MB / s do 910 SSD. Pelo menos para esse tipo de dispositivo, o uso de um tamanho de bloco de 2 MB parece melhorar os resultados em torno de 1 a 5%, apesar de fazer com que o kernel divida solicitações de hardware. Acho que mesmo com as otimizações do kernel, a sobrecarga de enviar mais syscalls é pior do que dividir dentro do kernel.
Mikko Rantalainen

1
Após testes adicionais, parece que obtenho a maior taxa de transferência seqüencial usando a potência de 2 valor menor que max_sectors_kb. Alterei os comandos de exemplo acima para usar um tamanho de bloco de 1 MB, porque isso parece funcionar com o hardware do mundo real. E eu também testei que fsyncnão importa para a leitura.
Mikko Rantalainen

1
Dependendo de como a unidade está conectada, você pode descobrir que a sua profundidade estava muito baixa. Você teria que ver o que o Linux está realmente enviando para baixo para o dispositivo e que profundidade é fazê-lo em ...
Anon

1
I definir iodeptha 1para acesso aleatório exatamente porque os programas do mundo real, muitas vezes executar algoritmos / lógica que não funciona com profundidade mais alto do que 1. Como resultado, se tal profundidade é "muito baixo" o dispositivo I / O é ruim. É verdade que alguns dispositivos SSD se beneficiarão de profundidade superior a 32. No entanto, você pode apontar para qualquer carga de trabalho do mundo real que exija acesso de leitura e seja capaz de manter a profundidade de iodo maior que 32? TL; DR: se você deseja reproduzir um número de referência de leitura incrivelmente alto com um dispositivo de alta latência, use, iodepth=256 --numjobs=4mas nunca espere ver esses números reais.
Mikko Rantalainen

1
A maioria dos programas do "mundo real" não está realmente enviando E / S (o_) diretamente, de forma assíncrona, de modo que todos os nossos exemplos estão em cargas de trabalho incomuns para empurrar os limites do território de referência (como dizem, a melhor referência é a sua carga de trabalho real). Dito isso, executar tarefas como executar várias máquinas virtuais ocupadas pode facilmente gerar cargas de trabalho com grandes profundidades, mas onde a E / S costuma parecer aleatória da perspectiva do disco e é um exemplo simples de onde você pode ver uma enorme aceleração de coisas como NVMe. PS: Os números de ajuste muito alto vai reduzir o rendimento por isso há um ponto doce ...
Anon

25

bonnie ++ é o utilitário de referência que eu conheço para o linux.

(Atualmente, estou preparando um livecd linux trabalhando com o bonnie ++ para testar nossa máquina baseada em janelas!)

Ele cuida do armazenamento em cache, sincronização, dados aleatórios, localização aleatória no disco, pequenas atualizações de tamanho, grandes atualizações, leituras, gravações etc. Comparando uma chave USB, um disco rígido (rotativo), uma unidade de estado sólido e uma ram O sistema de arquivos pode ser muito informativo para o novato.

Não tenho idéia se ele está incluído no Ubuntu, mas você pode compilá-lo da fonte facilmente.

http://www.coker.com.au/bonnie++/


Bonnie é falho no benchmarking de disco e pode gerar facilmente números que realmente refletem aspectos que não são do disco do sistema, portanto, é necessário um alto grau de cuidado se você optar por usá-lo. Consulte Benchmarking ativo de Brendan Gregg: Bonnie ++ para obter detalhes.
Anon

22

Velocidade de escrita

$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s

O tamanho do bloco é realmente muito grande. Você pode tentar com tamanhos menores, como 64k ou até 4k.


Velocidade de leitura

Execute o seguinte comando para limpar o cache da memória

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

Agora leia o arquivo que foi criado no teste de gravação:

$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s

Tenha cuidado com o uso de zeros para os seus dados de escrita - alguns sistemas de arquivos e discos terão um caminho especial caso para ele (e outros dados compressíveis), que fará com que artificialmente elevados números de referência ...
Anon

14

algumas dicas sobre como usar o bonnie ++

bonnie++ -d [TEST_LOCATION] -s [TEST_SIZE] -n 0 -m [TEST_NAME] -f -b -u [TEST_USER] 
bonnie++ -d /tmp -s 4G -n 0 -m TEST -f -b -u james

Um pouco mais em: EXEMPLO SIMPLES DE BONNIE ++ .


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.