Como verificar o desempenho de um disco rígido (via terminal ou GUI). A velocidade de gravação. A velocidade de leitura. Tamanho e velocidade do cache. Velocidade aleatória.
Como verificar o desempenho de um disco rígido (via terminal ou GUI). A velocidade de gravação. A velocidade de leitura. Tamanho e velocidade do cache. Velocidade aleatória.
Respostas:
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
gnome-disks
Há algo mais que você quer?
/dev/urandom
e /dev/zero
entradas para dd
testar um SSD, pois a compressibilidade dos dados pode ter um efeito maciço na velocidade de gravação.
/tmp
sistema de arquivos está usando um ramdisk. Portanto, escrever para /tmp
parece estar testando sua memória, não seu subsistema de disco.
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
Eu não recomendaria usar /dev/urandom
porque é 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,
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
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 --size
argumento 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_size
e --runtime
parâ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 fio
criará 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.dat
nos 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 --numjobs
acima. Isso define a simultaneidade para as leituras e gravações. Todos os exemplos acima foram numjobs
configurados para 1
que 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 numjobs
muito (por exemplo, 4
devem ser suficientes para obter os números de especificação mais altos), mas alguns SSDs "corporativos" precisam de 32
- 128
para obter os números de especificação porque a latência interna desses dispositivos é maior, mas a taxa de transferência geral é insana.
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 fsync
não importa para a leitura.
iodepth
a 1
para 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=4
mas nunca espere ver esses números reais.
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.
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
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 ++ .
Verifique a integridade, detecte unidades flash falsas e teste o desempenho, todos os três em um tiro.
Mais sobre esta resposta .