Linuxのベンチマークssd:crystaldiskmarkがWindowsで行うのと同じことを測定する方法


26

ssd(おそらく暗号化されたファイルシステムで)のベンチマークを行い、それをWindowsのcrystaldiskmarkによって行われたベンチマークと比較したいと思います。

Windows上のCrystalDiskMark

それでは、どのようにしてcrystaldiskmarkとほぼ同じことを測定できますか?

最初の行(Seq)については、次のようなことができると思います

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

しかし、ddパラメーターについてはわかりません。

ランダムな512KB、4KB、4KB(Queue Depth = 32)の読み取り/書き込み速度テストでは、Linuxで測定値を再現する方法がわかりませんか?どうすればこれを行うことができますか?

読書速度をテストsudo hdparm -Tt /dev/sdaするためには、たとえばencfs台紙のようなベンチマークをしたいので、私には意味がないように思えます。

編集

@アルコ、@ iain

おそらく、この質問の動機について何かを書く必要があります。私のssdのベンチマークを行い、いくつかの暗号化ソリューションを比較しようとしています。しかし、それは別の質問です(私のシステムでさまざまな暗号化ソリューションをベンチマークする最良の方法)。ssdとベンチマークについてWebでネットサーフィンしている間、ユーザーがCrystelDiskMarkの結果をフォーラムに投稿するのをよく見ました。したがって、これが質問の唯一の動機です。Linuxでも同じことをしたいだけです。私の特定のベンチマークについては、他の質問をご覧ください。


両方のシステムで動作するベンチマークツールを使用しないのはなぜですか?
アルコ

これが見つかりました。非常に便利なようで、3つの別々のドライブでの簡単なテストで、実際のcrystaldiskmark
ljwobker

2019:このQは新たなスタートに値します-重要なトピックですが、ここでは少し焦点を失っています。「受け入れてアーカイブ」。
rastafile

回答:


22

私は、fioがこれらのワークロードを生成するのに問題はないと思います。CrystalDiskMarkという名前にもかかわらず、実際には特定のディスク上のファイルシステムのベンチマークであることに注意してください。ディスクへのI / O rawだけを行うことはできません。そのため、常にファイルシステムのオーバーヘッドが発生します(必ずしも悪いことではありませんが、たとえば比較対象のファイルシステムが同じではないため、注意が必要です)。

上記のスクリーンショットの出力をCrystalDiskMarkマニュアルからの情報で補完することに基づく例(これは完全ではありませんが、一般的な考えを与えるはずです):

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 

注意してください -この例では、データを永久に破壊します/mnt/fs/fiotest.tmp

fioパラメータのリストはhttp://fio.readthedocs.io/en/latest/fio_doc.htmlで見ることができます。


3
Ubuntu 16.04でfioを、Windows 7でCrystalDiskMarkを試しました。いくつかの数値は一致しますが、一致しない数値もあります。連続したr / wは2倍オフでした。つまり、Linuxの値はCDM v3.0.4によって報告された値の50%でした(注:現在のバージョンは6.0.0ですが、古いバージョンはまだダウンロード可能です)。格差をいじるには、1mではなくbs = 4mを設定します。それは数字をより近づけた。8mと32mを試してみると、さらに近づきました。最終的にAnonが答えは完全ではなく、@ Alkoのように言ったように、両方のOSで同じツールが必要です。また、最新のCDM 6はOPとは異なるテストを使用していることに注意してください。素敵な情報アノン
ヴァヒドパジランデ

2
@VahidPazirandeh興味深い、github.com / buty4649 / fio-cdm / blob / master / fio- cdmには同じ1m設定がありますが、cdmのドキュメントでは不十分な場合があります。
inf3rno

@ vahid-pazirandehどういたしまして。注意:両方のOSで同じツールが必要な場合はfio 、Windows用のバージョンもあることに注意してください。
アノン

8

crystaldiskmarkの動作をfioで再現しようとするスクリプトを作成しました。スクリプトは、512Kおよび4KQ8T8テストを含むcrystaldiskmark 6までのcrystaldiskmarkのさまざまなバージョンで利用可能なすべてのテストを実行します。

スクリプトはfiodfに依存します。dfをインストールしたくない場合は、19行目から21行目を消去するか(スクリプトはテスト中のドライブを表示しなくなります)、またはコメンターから変更されたバージョンを試します。(他の考えられる問題も解決する場合があります)

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

次のような結果が出力されます:

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

(結果は色分けされています。色分けを削除するに\033[x;xxmは、スクリプトの下部にあるechoコマンドから(xは数字)のすべてのインスタンスを削除します。)

引数なしでスクリプトを実行すると、ホームドライブ/パーティションの速度がテストされます。代わりにテストする場合は、別のハードドライブ上のディレクトリへのパスを入力することもできます。スクリプトの実行中に、ターゲットディレクトリに非表示の一時ファイルが作成され、実行終了後にクリーンアップされます(.fiomark.tmpおよび.fiomark.txt)

テスト結果が完了すると表示されませんが、すべてのテストが完了する前にコマンドの実行中にコマンドをキャンセルすると、完了したテストの結果が表示され、一時ファイルも削除されます。

いくつかの調査の後、私はcrystaldiskmarkベンチマークの結果が、少なくとも一目でこのfioベンチマークの結果と比較的密接に一致しているように見えるのと同じモデルのドライブであることがわかりました。Windowsをインストールしていないので、同じドライブ上で実際にどれだけ近いかを確認できません。

特にテストの実行中にバックグラウンドで何かをしている場合は、結果がわずかにずれることがあるので、結果を比較するために連続して2回テストを実行することをお勧めします。

これらのテストの実行には時間がかかります。現在、スクリプトのデフォルト設定は通常の(SATA)SSDに適しています。

さまざまなドライブに推奨されるSIZE設定:

  • (SATA)SSD:1024(デフォルト)
  • (任意)HDD:256
  • (ハイエンドNVME)SSD:4096
  • (Low-Mid End NVME)SSD:1024(デフォルト)

通常、ハイエンドNVMEの読み取り速度は約2GB / sです(Intel OptaneおよびSamsung 960 EVOが例です;後者の場合、4kbの速度が遅いため、代わりに2048をお勧めします)。 〜500-1800MB / sの読み取り速度。

これらのサイズを調整する主な理由は、それ以外の場合にテストにかかる時間です。たとえば、古い/弱いHDDの場合、0.4MB / sの4kb読み取り速度を使用できます。その速度で1GBの5ループを待ってみてください。他の4kbテストでは通常、1MB / s程度の速度です。6つあります。5ループを実行するたびに、30GBのデータがそれらの速度で転送されるのを待ちますか?または、代わりに7.5GBのデータに下げますか?(256MB /秒で2〜3時間のテストです)

もちろん、そのような状況を処理するための理想的な方法は、4kテストとは別にシーケンシャル&512kテストを実行することです(したがって、512mなどのシーケンシャルテストと512kテストを実行し、32mで4kテストを実行します)

最新のHDDモデルはハイエンドであり、それよりもはるかに良い結果を得ることができます。

そして、あなたはそれを持っています。楽しい!


Windowsでのfioでのスクリプトの動作を確認しましたか?
アノン

1
(Cestarian以外の読者への注意:fioを使用する新しいツールを作成する場合、可能な限り人間が読めるfio出力をスクレイプしないでください--output-format=json。JSONを使用して解析してください。Fioの人間が読める出力はマシン向けではありませんfioのバージョン間で安定していません。fioの人間の出力をスクレイピングすると望ましくない結果につながるケースのYouTubeビデオを参照してください)
Anon

ありがとう、私はそれを覚えておいて、悲しいことに、私はもはやWindowsをインストールしていないので、それをテストすることはできません...しかし、私はssdのcrystaldiskmarkの結果を調べることにし、私の記憶が間違っていたようです結果は、結局私がfioで取得している結果になります。結果が遅いと思うようになったのは、私の側の誤解でした:/私はそれを修正します。私も(私はそれに取り組んで始めたが、gtkdialogが悪い文書化され、私は苦労していますので、zenityを使うが限定されている)futureproofingためのJSON出力、そしておそらくGUIバージョンを使用してすぐにこの答えを更新します
Cestarian

1
@Cestarian、すばらしいスクリプトですが、CentOS7では「そのまま」動作しません。少し修正しなければなりませんでした。
イゴール

1
@Igorおもしろい、そう、私はマンジャロでそれを作った、そして私はbashの専門家ではない:)他の誰かが問題を抱えている場合に備えて、私は答えであなたの修正版を述べた。
Cestarian

5

あなたは使用することができるiozonebonnie。クリスタルディスクマークができること以上のことができます。

iozoneパーソナルコンピューターからエンタープライズストレージシステムまで、デバイスのベンチマークとストレステストを行っている間、私は個人的に多く使用しました。すべてを実行する自動モードがありますが、ニーズに合わせて調整できます。


5
これでクリスタルマーク測定を詳細に再現する方法は?
学生

2
ハウツーを書くために最善を尽くしますが、Crystal Disk Markが実施するテストのリストが必要です。スクリーンショットに表示されているテストの横にソフトウェアが実行する他のテストはありますか?
bayindirh

1
スクリーンショットにあるものだけ。
-trr

1

あなたが何をしているのかを詳細に検討するときに、さまざまなより深いテストが本当に意味をなすかどうかはわかりません。

ブロックサイズやキューの深さなどの設定は、SSDが搭載されているATAインターフェイスの低レベルの入力/出力パラメーターを制御するためのパラメーターです。

これは、単純なパーティション化されたファイルシステムの大きなファイルのように、ドライブに対して基本的なテストをかなり直接実行している場合に、すべてうまくいきます。

encfsのベンチマークについて話し始めると、これらのパラメーターはファイルシステムに特に適用されなくなります。ファイルシステムは、最終的にドライブに戻るファイルシステムに戻る単なるインターフェイスです。

ここでプレイする2つの要因があるので、正確に測定しようとしているものを理解することが役立つと思います-さまざまなDDコマンドのタイミングでテストできるrawディスクIO速度want)/ without / encfs、またはプロセスが暗号化によってCPUに制限され、暗号化アルゴリズムの相対スループットをテストしようとしています。この場合、キューの深さなどのパラメーターは特に関係ありません。

両方の点で、時間指定DDコマンドを使用すると、求める基本的なスループット統計が得られますが、測定する対象とそれに関連するパラメーターを考慮する必要があります。

このリンクは、「バッファ/キャッシュの無効化」などに必要なカバレッジを含む、時間指定されたDDコマンド使用したディスク速度テストの優れたガイドとなるようです。おそらく、これは必要な情報を提供します。ディスクパフォ​​ーマンスと暗号化パフォーマンスのどちらに関心があるかを判断します。2つのうちの1つがボトルネックになり、非ボトルネックを調整しても何のメリットもありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.