Benchmark ssd on linux: Como medir as mesmas coisas que o crystaldiskmark faz no windows

18

Eu quero fazer um benchmark de um ssd (possivelmente com sistemas de arquivos criptografados) e compará-lo com benchmarks feitos pelo crystaldiskmark no Windows.

Então,comopossomediraproximadamenteasmesmascoisasqueocrystaldiskmarkfaz?

Paraaprimeiralinha(Seq),achoquepoderiafazeralgocomo

LC_ALL=Cddif=/dev/zeroof=tempfilebs=1Mcount=1024conv=fdatasync,notruncsudosu-c"echo 3 > /proc/sys/vm/drop_caches"
LC_ALL=C dd if=tempfile of=/dev/null bs=1M count=1024

Mas não tenho certeza sobre os parâmetros dd .

Para os testes de velocidade aleatórios de 512KB, 4KB, 4KB (profundidade da fila = 32), não tenho idéia de como reproduzir as medições no linux? Então, como posso fazer isso?

Para testar a velocidade de leitura, algo como sudo hdparm -Tt /dev/sda parece não fazer sentido para mim, pois quero, por exemplo, compará-lo com algo como encfs montagens.

Editar

@Alko, @iain

Talvez eu deva escrever algo sobre a motivação sobre essa questão: Estou tentando fazer um benchmark do meu ssd e comparar algumas soluções de criptografia. Mas essa é outra questão ( Melhor maneira de comparar diferentes soluções de criptografia no meu sistema ). Enquanto navega na web sobre SSDs e benchmarking, eu tenho visto frequentemente usuários postando seus resultados do CrystelDiskMark em fóruns. Então esta é a única motivação para a pergunta. Eu só quero fazer o mesmo no linux. Para meu benchmarking específico, veja minha outra pergunta.

    
por student 06.10.2013 / 11:05

4 respostas

12

Eu diria que fio não teria problemas para produzir essas cargas de trabalho. Observe que, apesar de seu nome, CrystalDiskMark é, na verdade, uma referência de um sistema de arquivos em um disco específico - ele não pode fazer I / O bruto para o disco sozinho. Como tal, ele sempre terá uma sobrecarga no sistema de arquivos (não necessariamente uma coisa ruim, mas algo a se conhecer, por exemplo, porque os sistemas de arquivos comparados podem não ser os mesmos).

Um exemplo baseado na replicação da saída na captura de tela acima complementada por informações do manual do CrystalDiskMark (isso não está completo, mas deve dar uma ideia geral):

fio --loops=5 --size=1000m --filename=/mnt/fs/fiotest.tmp --stonewall --ioengine=libaio --direct=1 \
  --name=Seqread --bs=1m --rw=read \
  --name=Seqwrite --bs=1m --rw=write \
  --name=512Kread --bs=512k --rw=randread \
  --name=512Kwrite --bs=512k --rw=randwrite \
  --name=4kQD32read --bs=4k --iodepth=32 --rw=randread \
  --name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite
rm -f /mnt/fs/fiotest.tmp 

CUIDADO - este exemplo permanentemente destrói os dados em /mnt/fs/fiotest.tmp !

Uma lista de parâmetros de fio pode ser vista no link .

    
por 13.09.2017 / 23:38
3

Você pode usar iozone e bonnie . Eles podem fazer o que a marca de disco de cristal pode fazer e muito mais.

Eu pessoalmente usei muito iozone enquanto testava e testava dispositivos de estresse, de computadores pessoais a sistemas de armazenamento corporativo. Tem um modo automático que faz tudo, mas você pode adaptá-lo às suas necessidades.

    
por 08.10.2013 / 16:32
2

Eu criei um script que tenta replicar o comportamento do crystaldiskmark 5 com fio. (Revisado: agora faz todos os testes disponíveis nas várias versões do crystaldiskmark até o crystaldiskmark 6, incluindo testes 512K e 4KQ8T8 + mais melhorias)

#!/bin/bash

LOOPS=5 #How many times to run each test
SIZE=1024 #Size of each test, multiples of 32 recommended for Q32 tests to give the most accurate results.
WRITEZERO=0 #Set whether to write zeroes or randoms to testfile (random is the default for both fio and crystaldiskmark); dd benchmarks typically only write zeroes which is why there can be a speed difference.

QSIZE=$(($SIZE / 32)) #Size of Q32Seq tests
SIZE+=m
QSIZE+=m

if [ -z $1 ]; then
    TARGET=$HOME
    echo "Defaulting to $TARGET for testing"
else
    TARGET="$1"
    echo "Testing in $TARGET"
fi

DRIVE=$(df $TARGET | grep /dev | cut -d/ -f3 | cut -d" " -f1 | rev | cut -c 2- | rev)
DRIVEMODEL=$(cat /sys/block/$DRIVE/device/model)
DRIVESIZE=$(($(cat /sys/block/$DRIVE/size)*512/1024/1024/1024))GB

echo "Configuration: Size:$SIZE Loops:$LOOPS Write Only Zeroes:$WRITEZERO
Running Benchmark on: /dev/$DRIVE, $DRIVEMODEL ($DRIVESIZE), please wait...
"

fio --loops=$LOOPS --size=$SIZE --filename=$TARGET/.fiomark.tmp --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
  --name=Bufread --loops=1 --bs=$SIZE --iodepth=1 --numjobs=1 --rw=readwrite \
  --name=Seqread --bs=$SIZE --iodepth=1 --numjobs=1 --rw=read \
  --name=Seqwrite --bs=$SIZE --iodepth=1 --numjobs=1 --rw=write \
  --name=512kread --bs=512k --iodepth=1 --numjobs=1 --rw=read \
  --name=512kwrite --bs=512k --iodepth=1 --numjobs=1 --rw=write \
  --name=SeqQ32T1read --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=read \
  --name=SeqQ32T1write --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=write \
  --name=4kread --bs=4k --iodepth=1 --numjobs=1 --rw=randread \
  --name=4kwrite --bs=4k --iodepth=1 --numjobs=1 --rw=randwrite \
  --name=4kQ32T1read --bs=4k --iodepth=32 --numjobs=1 --rw=randread \
  --name=4kQ32T1write --bs=4k --iodepth=32 --numjobs=1 --rw=randwrite \
  --name=4kQ8T8read --bs=4k --iodepth=8 --numjobs=8 --rw=randread \
  --name=4kQ8T8write --bs=4k --iodepth=8 --numjobs=8 --rw=randwrite > $TARGET/.fiomark.txt

SEQR="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "Seqread"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "Seqread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQW="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "Seqwrite"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "Seqwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KR="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "512kread"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "512kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KW="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "512kwrite"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "512kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32R="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "SeqQ32T1read"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "SeqQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32W="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "SeqQ32T1write"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "SeqQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKR="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kread"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKW="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kwrite"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32R="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ32T1read"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32W="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ32T1write"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK8R="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ8T8read"' | grep bw_bytes | sed 's/        "bw_bytes" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ8T8read"' | grep iops | sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"
FK8W="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ8T8write"' | grep bw_bytes | sed 's/        "bw_bytes" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ8T8write"' | grep '"iops" '| sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"

echo -e "
Results from /dev/$DRIVE, $DRIVEMODEL ($DRIVESIZE):  
3[0;33m
Sequential Read: $SEQR
Sequential Write: $SEQW
3[0;32m
512KB Read: $F12KR
512KB Write: $F12KW
3[1;36m
Sequential Q32T1 Read: $SEQ32R
Sequential Q32T1 Write: $SEQ32W
3[0;36m
4KB Read: $FKR
4KB Write: $FKW
3[1;33m
4KB Q32T1 Read: $FK32R
4KB Q32T1 Write: $FK32W
3[1;35m
4KB Q8T8 Read: $FK8R
4KB Q8T8 Write: $FK8W
"

rm $TARGET/.fiomark.txt $TARGET/.fiomark.tmp

Que produzirá resultados como este:

Results from /dev/sdb, Corsair Force GT (111GB):  

Sequential Read: 533MB/s IOPS=0
Sequential Write: 125MB/s IOPS=0

512KB Read: 457MB/s IOPS=914
512KB Write: 133MB/s IOPS=267

Sequential Q32T1 Read: 534MB/s IOPS=16
Sequential Q32T1 Write: 134MB/s IOPS=4

4KB Read: 32MB/s IOPS=8224
4KB Write: 150MB/s IOPS=38460

4KB Q32T1 Read: 195MB/s IOPS=49951
4KB Q32T1 Write: 121MB/s IOPS=31148

4KB Q8T8 Read: 129MB/s IOPS=33149
4KB Q8T8 Write: 132MB/s IOPS=33796

(Revisão: Os resultados agora são codificados por cores, para remover o código de cores, remova todas as instâncias de 3[x;xxm (onde x é um número) do comando echo na parte inferior do script.)

O script quando executado sem argumentos testará a velocidade da sua unidade / partição inicial. Você também pode inserir um caminho para um diretório em outro disco rígido se quiser testá-lo. Durante a execução, o script cria arquivos temporários ocultos no diretório de destino, que são limpos após a conclusão da execução (.fiomark.tmp e .fiomark.txt)

Você não pode ver os resultados do teste quando eles são concluídos, mas se você cancelar o comando enquanto estiver em execução antes de concluir todos os testes, você verá os resultados dos testes concluídos e os arquivos temporários serão excluídos posteriormente também .

Depois de algumas pesquisas, descobri que o benchmark crystalmark resulta no mesmo modelo de drive que eu pareço relativamente próximo aos resultados deste benchmark da fio, pelo menos de relance. Como eu não tenho uma instalação do Windows, não consigo verificar o quão próximo eles realmente estão, com certeza, na mesma unidade.

Observe que às vezes você pode obter resultados um pouco fora, especialmente se estiver fazendo algo em segundo plano enquanto os testes estão sendo executados, portanto é aconselhável executar o teste duas vezes seguidas para comparar os resultados.

Esses testes levam muito tempo para serem executados. As configurações padrão no script atualmente são adequadas para um SSD normal (SATA).

Configuração de tamanho recomendado para unidades diferentes:

    SSD:
  • (SATA): 1024 (padrão)
  • (QUALQUER) HDD: 256
  • (High End NVME) SSD: 4096
  • (Low-Mid End NVME) SSD: 1024 (padrão)
Um High End NVME normalmente tem velocidades de leitura de ~ 2GB / s (Intel Optane e Samsung 960 EVO são exemplos; mas no caso deste último, eu recomendaria 2048, em vez de velocidades mais lentas de 4kb.), um Low-Mid End pode tem entre 500-1800MB / s velocidades de leitura.

A principal razão pela qual esses tamanhos devem ser ajustados é por causa de quanto tempo os testes seriam necessários, para HDDs mais antigos / mais fracos, por exemplo, você pode ter velocidades de leitura de até 4 MBb de 0,4 MB / s. Você tenta esperar por 5 loops de 1GB nessa velocidade, outros testes de 4kb normalmente têm velocidade de 1MB / s. Nós temos 6 deles. Cada um executando 5 loops, você espera que 30 GB de dados sejam transferidos nessas velocidades? Ou você quer diminuir isso para 7,5 GB de dados em vez disso (a 256MB / s é um teste de 2-3 horas)

É claro que o método ideal para lidar com essa situação seria executar sequencialmente & Testes de 512k separados dos testes 4k (então, execute os testes sequenciais e 512k com algo como 512m e, em seguida, execute os testes de 4k a 32m)

Modelos de HDD mais recentes têm um final mais alto e podem obter resultados muito melhores do que isso.

E você tem isso. Aproveite!

    
por 06.11.2018 / 19:19
1

Não tenho certeza se os vários testes mais profundos fazem sentido ao considerar o que você está fazendo em detalhes.

As configurações como o tamanho do bloco e a profundidade da fila são parâmetros para controlar os parâmetros de entrada / saída de baixo nível da interface ATA em que seu SSD está sentado.

Isso tudo é bom quando você está apenas executando algum teste básico contra uma unidade de forma bastante direta, como para um arquivo grande em um sistema de arquivos particionado simples.

Uma vez que você começa a falar sobre benchmarking em um encfs, estes parâmetros não se aplicam mais ao seu sistema de arquivos, o sistema de arquivos é apenas uma interface em outra coisa que eventualmente faz o backup em um drive.

Eu acho que seria útil entender o que exatamente você está tentando medir, porque há dois fatores em jogo aqui - a velocidade de E / S do disco bruto, que você pode testar cronizando vários comandos DD (pode dar exemplos se é o que você quer) / sem / encfs, ou o processo será limitado pela CPU pela criptografia e você está tentando testar a taxa de transferência relativa do algoritmo de criptografia. Nesse caso, os parâmetros para a profundidade da fila, etc., não são particularmente relevantes.

Em ambos os aspectos, um comando DD cronometrado lhe dará as estatísticas básicas de throughput que você procura, mas você deve considerar o que você pretende medir e os parâmetros relevantes para isso.

Este link parece fornecer um bom guia para a velocidade do disco teste usando timed DD comandos incluindo a cobertura necessária sobre 'buffers de derrota / cache' e assim por diante. Provavelmente isso fornecerá as informações necessárias. Decida qual você está mais interessado no desempenho do disco ou no desempenho da criptografia, um dos dois será o gargalo, e o ajuste do não gargalo não beneficiará nada.

    
por 08.10.2013 / 16:21