Linux üzerinde Benchmark SSD: crystaldiskmark'ın Windows'ta yaptığı gibi nasıl ölçülür?


26

Bir ssd'yi (muhtemelen şifrelenmiş dosya sistemleriyle) kıyaslamak ve crystaldiskmark tarafından pencerelerde yapılan ölçütlerle karşılaştırmak istiyorum.

Windows'ta CrystalDiskMark

Peki yaklaşık olarak aynı şeyi crystaldiskmark'ın yaptığı gibi nasıl ölçebilirim?

İlk satır için (Sıra) Sanırım bir şey yapabilirim

LC_ALL=C dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

sudo su -c "echo 3 > /proc/sys/vm/drop_caches"
LC_ALL=C dd if=tempfile of=/dev/null bs=1M count=1024

Ancak ddparametreler hakkında emin değilim .

Rastgele 512KB, 4KB, 4KB (Queue Depth = 32) hız testlerini okuyor / yazıyor Linux ölçümlerini nasıl çoğaltacağım hakkında hiçbir fikrim yok? Peki bunu nasıl yapabilirim?

Okuma hızlarını test etmek gibi bir şey sudo hdparm -Tt /dev/sdabenim için mantıklı görünmüyor çünkü örneğin encfstakma gibi bir kıyaslama yapmak istiyorum .

Düzenle

@Alko, @iain

Belki de bu sorudaki motivasyon hakkında bir şeyler yazmalıyım: SSD'mi kıyaslamaya ve bazı şifreleme çözümlerini karşılaştırmaya çalışıyorum. Ama bu başka bir soru ( Sistemimdeki farklı şifreleme çözümlerini kıyaslamanın en iyi yolu ). Ssd ve benchmarking hakkında internette gezinirken, CrystelDiskMark sonuçlarını forumlarda yayınlayan kullanıcıları sık sık gördüm. Demek soru için tek motivasyon bu. Sadece Linux üzerinde aynısını yapmak istiyorum. Özel kıyaslamam için diğer sorumu görün.


Neden her iki sistemde de çalışan bir kıyaslama aracı kullanmıyorsunuz?
Alko

Bunu buldum, çok kullanışlı görünüyor ve üç ayrı sürücüdeki kısa testimde
ljwobker

2019: Bu Q, yeni bir başlangıcı hak ediyor - önemli bir konu, ancak burada odak noktasını biraz kaybetti. "Kabul et ve arşivle".
rastafile

Yanıtlar:


22

Fio'nun bu iş yüklerini üretmekte hiç zorlanmayacağını söyleyebilirim . CrystalDiskMark ismine rağmen, aslında belirli bir diskte bir dosya sisteminin bir ölçütü olduğunu unutmayın - tek başına disk için ham I / O yapamaz. Bu nedenle, içinde her zaman bir dosya sistemi bulunacaktır (mutlaka kötü bir şey değil, örneğin karşılaştırılmakta olan dosya sistemleri aynı olmayabilir çünkü farkında olması gereken bir şey).

CrystalDiskMark el kitabındaki bilgilerle desteklenen yukarıdaki ekran görüntüsündeki çıktının kopyalanmasına dayanan bir örnek (bu tam değildir ancak genel bir fikir vermelidir):

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 

DİKKATLİ OLUN - Bu örnek , içindeki verileri kalıcı olarak yok eder /mnt/fs/fiotest.tmp!

Http://fio.readthedocs.io/tr/latest/fio_doc.html adresinde fio parametrelerinin bir listesi görülebilir .


3
Windows 7'de Ubuntu 16.04'te ve CrystalDiskMark'ta fio'yu denedim, bazıları ise uyuşmuyor. Sıralı r / w 2 faktörü ile kapatıldı. Anlamı, Linux değerleri CDM v3.0.4 tarafından bildirilenlerin% 50'si idi (not: geçerli sürüm 6.0.0, ancak eski sürümler hala indirilebilir durumda). Dengesizliği arttırmak için 1m yerine bs = 4m olarak ayarlarım. Bu sayıları daha da yaklaştırdı. 8 ve 32 m denemek daha da yakınlaştı. Nihayetinde Anon'un cevabının tam olmadığını ve @Alko gibi, her iki işletim sisteminde de aynı araca ihtiyacımız var. Ayrıca en yeni CDM 6'nın OP'den farklı testler kullandığını unutmayın. Güzel bilgi Anon
Vahid Pazirandeh

2
@VahidPazirandeh İlginç, github.com/buty4649/fio-cdm/blob/master/fio-cdm aynı 1m ayarlarına sahip, belki de cdm dokümantasyonu yeterince iyi değil.
inf3rno,

@ vahid-pazirandeh Bir şey değil. Not: Her iki işletim sisteminde de aynı aracı istiyorsanız, fio Windows sürümü de bulunduğunu unutmayın .
Anon

8

Crystaldiskmark'ın davranışını fio ile kopyalamaya çalışan bir senaryo oluşturdum. Betik, 512K ve 4KQ8T8 testleri dahil olmak üzere crystaldiskmark'ın çeşitli sürümlerinde mevcut olan crystaldiskmark 6'ya kadar olan tüm testleri yapar.

Senaryo bağlıdır FIO ve df . Df'yi kurmak istemiyorsanız, 19 ile 21 arasındaki satırları silin (script artık hangi sürücünün test edildiğini göstermeyecek) veya değiştirilmiş sürümü bir yorumlayıcıdan deneyin . (Diğer olası sorunları da çözebilir)

#!/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):  
\033[0;33m
Sequential Read: $SEQR
Sequential Write: $SEQW
\033[0;32m
512KB Read: $F12KR
512KB Write: $F12KW
\033[1;36m
Sequential Q32T1 Read: $SEQ32R
Sequential Q32T1 Write: $SEQ32W
\033[0;36m
4KB Read: $FKR
4KB Write: $FKW
\033[1;33m
4KB Q32T1 Read: $FK32R
4KB Q32T1 Write: $FK32W
\033[1;35m
4KB Q8T8 Read: $FK8R
4KB Q8T8 Write: $FK8W
"

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

Bunun gibi sonuçlar çıkacak:

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

(Sonuçlar renk kodlamasıdır, renk kodlamasını kaldırmak için tüm örnekleri \033[x;xxm(burada x bir sayıdır) betiğin altındaki eko komutundan kaldırın .)

Argümanlar olmadan çalıştırıldığında komut dosyası, ev sürücünüzün / bölümünüzün hızını sınar. Bunu test etmek istiyorsanız, başka bir sabit sürücüdeki bir dizine giden yolu da girebilirsiniz. Komut dosyasını çalıştırırken hedef dizinde, çalışmayı bitirdikten sonra temizlediği gizli geçici dosyalar oluşturur (.fiomark.tmp ve .fiomark.txt)

Test sonuçlarını tamamlandıkça göremezsiniz, ancak tüm testleri tamamlamadan önce komutu çalıştırırken iptal ederseniz, tamamlanmış testlerin sonuçlarını göreceksiniz ve geçici dosyalar daha sonra silinecek.

Bazı araştırmalardan sonra, crystaldiskmark kriterinin, en azından bir bakışta, bu fio benchmarkının sonuçlarıyla oldukça yakından eşleştiğim gibi aynı sürücü modeli ile sonuçlandığını gördüm. Windows yüklemem olmadığı için, aynı sürücüde ne kadar kesin olduklarını doğrulayamıyorum.

Bazen, testler çalışırken arka planda bir şey yapıyorsanız sonuçları hafifçe azaltabileceğinizi unutmayın; bu nedenle, sonuçları karşılaştırmak için testi arka arkaya iki kez çalıştırmanız önerilir.

Bu testlerin çalışması uzun zaman alıyor. Koddaki varsayılan ayarlar şu anda normal (SATA) SSD için uygundur.

Farklı sürücüler için önerilen BOYUT ayarı:

  • (SATA) SSD: 1024 (varsayılan)
  • (HERHANGİ) HDD: 256
  • (Yüksek Uçlu NVME) SSD: 4096
  • (Düşük-Orta Uçlu NVME) SSD: 1024 (varsayılan)

Bir High End NVME tipik olarak yaklaşık ~ 2GB / sn okuma hızına sahiptir (Intel Optane ve Samsung 960 EVO örneklerdir; ancak ikinci durumda, daha düşük 4kb hızlar yerine 2048'i öneriyorum). ~ 500-1800 MB / sn okuma hızı.

Bu boyutların ayarlanması gerektiğinin temel nedeni, testlerin aksi takdirde ne kadar süreceği nedeniyledir, örneğin daha eski / daha zayıf olan HDD'ler için, 0,4 MB / sn 4kb Okuma hızlarına kadar sahip olabilirsiniz. Bu hızda 5 GB'lik 1 döngüyü beklemeye çalışırsınız, diğer 4kb testlerinde tipik olarak yaklaşık 1MB / s hız vardır. Onlardan 6 tane var. Çalışan her 5 döngü, bu hızlarda 30GB veri aktarılmasını bekler misiniz? Yoksa bunun yerine 7.5GB Veriyi düşürmek ister misiniz (256MB / s'de 2-3 saatlik bir testtir)

Tabii ki, bu durumla başa çıkmak için ideal yöntem, 4k testlerinden ayrı sıralı & 512k testleri yapmaktır (bu nedenle sıralı ve 512k testlerini 512m gibi bir şeyle çalıştırın ve daha sonra 4m testlerini 32m'de çalıştırın).

Daha yeni HDD modelleri olsa da daha üstün ve bundan daha iyi sonuçlar elde ediyorlar.

İşte buyur. Keyfini çıkarın!


Komut dosyanızın Windows'ta fio ile nasıl davrandığını kontrol ettiniz mi?
Anon

1
(Cestarian dışındaki okuyucular için bir not: eğer fio kullanan yeni bir araç yapıyorsanız, eğer mümkünse insan tarafından okunabilir fio çıktısını kazıyın - --output-format=jsonJSON kullanın ve ayrıştırın. Fio'un okunabilir çıktısı makineler için değildir ve fio sürümleri arasında istikrarlı değil.Fio'nun insan çıktısının kazınmasının istenmeyen bir sonuca yol açtığı bir durumun bu YouTube videosunu izleyin )
Anon

Teşekkürler, bunu aklımda tutacağım, ne yazık ki artık bir windows kurulumuna sahip değilim, bu yüzden bunu test edemiyorum ... ama ssd için crystaldiskmark sonuçlarını aramaya karar verdim ve hafızam yanlış görünüyor Neticede fio'da elde ettiğim sonuçları da topladım. Sonunda, sonuçların daha yavaş olduğunu düşünmeme neden olan bir yanlış anlama oldu: / Düzelteceğim. Ayrıca bu cevabı kısa süre sonra geleceğe yönelik koruma için json çıktısını ve belki bir GUI versiyonunu kullanmak için de güncelleyeceğim (üzerinde çalışmaya başladım, ancak gtkdialog zayıf bir şekilde belgelendi ve zenity sınırlı, bu yüzden zor zaman geçiriyorum)
Cestarian

1
@Cestarian, harika senaryo, ancak CentOS7'de "kutudan çıkma" çalışmıyor. Onu biraz değiştirmek zorunda kaldım .
Igor

1
@ İlginç İlginç, evet ben manjaro yaptım ve ben gerçekten bash konusunda uzman değilim.
Cestarian

5

Sen kullanabilirsiniz iozoneve bonnie. Kristal disk markasının yapabildiklerini ve daha fazlasını yapabilirler.

iozoneKişisel bilgisayarlardan kurumsal depolama sistemlerine kadar kıyaslama yaparken ve test cihazlarını test ederken kişisel olarak çok kullandım . Her şeyi yapan bir oto moda sahiptir, ancak ihtiyaçlarınıza göre uyarlayabilirsiniz.


5
Kristal damgası ölçümleri bu şekilde nasıl yeniden üretilir?
Öğrenci

2
Bir el yazısı yazmak için elimden geleni yapacağım ama Crystal Disk Mark'ın yaptığı testlerin listesine ihtiyacım var. Yazılımın ekran görüntüsünde görünenlerin yanında yaptığı başka testler var mı?
bayindirh

1
Sadece ekran görüntüsünde olanlar.
trr

1

Ayrıntılı olarak ne yaptığınızı düşünürken, daha derin olan çeşitli testlerin gerçek bir anlam ifade ettiğinden emin değilim.

Blok boyutu ve sıra derinliği gibi ayarlar, SSD'nizin üzerinde oturduğu ATA arabiriminin düşük seviye giriş / çıkış parametrelerini kontrol etmek için parametrelerdir.

Basitçe bölümlenmiş bir dosya sistemindeki büyük bir dosya gibi, doğrudan doğrudan bir sürücüye karşı bazı temel testler yaptığınız zaman her şey iyi ve güzel.

Bir encfs'i kıyaslamadan bahsetmeye başladığınızda, bu parametreler artık dosya sisteminize özellikle uygulanmaz, dosya sistemi sadece bir sürücüye geri dönen bir dosya sistemine dayanan başka bir şey için bir arayüzdür.

Tam olarak neyi ölçmeye çalıştığınızı anlamanızın faydası olacağını düşünüyorum, çünkü burada oyunda iki faktör var - çeşitli DD komutlarını zamanlayarak test edebileceğiniz ham disk IO hızı (eğer sizin want) / without / encfs, ya da işlem şifreleme tarafından sınırlanan CPU olacaktır ve şifreleme algoritmasının göreceli verimini test etmeye çalışıyorsunuz. Bu durumda sıra derinliği vb. Parametreler özellikle ilgili değildir.

Her iki açıdan da, zamanlanmış bir DD komutu size aradığınız temel işlem istatistiklerini verecektir, ancak neyi ölçmek istediğinizi ve bununla ilgili parametreleri dikkate almalısınız.

Bu bağlantı, zaman zaman DD komutları kullanarak 'arabellekleri / önbellekleri yenme' ve benzeri konularla ilgili gerekli kapsam dahil olmak üzere zamanlanmış DD komutlarını kullanarak disk hızı testi için iyi bir rehber gibi görünmektedir . Muhtemelen bu ihtiyacınız olan bilgiyi sağlayacaktır. Tho, disk performansı veya şifreleme performansı ile hangisine daha fazla ilgi duyduğunuza karar verin, ikisinden biri darboğaz olacaktır ve darboğazın ayarının hiçbir faydası olmayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.