Benchmark ssd di linux: Cara mengukur hal yang sama seperti crystaldiskmark di windows

26

Saya ingin melakukan benchmark ssd (mungkin dengan filesystem terenkripsi) dan membandingkannya dengan tolok ukur yang dilakukan oleh crystaldiskmark di windows.

CrystalDiskMark di Windows

Jadi bagaimana saya bisa mengukur hal yang kira-kira sama dengan crystaldiskmark?

Untuk baris pertama (Seq) saya pikir saya bisa melakukan sesuatu seperti

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

Tapi saya tidak yakin dengan ddparameternya.

Untuk 512KB acak, 4KB, 4KB (Kedalaman Antrian = 32) membaca / menulis tes kecepatan. Saya tidak tahu cara mereproduksi pengukuran di linux? Jadi bagaimana saya bisa melakukan ini?

Untuk menguji kecepatan membaca, sesuatu seperti sudo hdparm -Tt /dev/sdasepertinya tidak masuk akal bagi saya karena saya ingin misalnya membandingkan sesuatu seperti encfsmount.

Edit

@Alko, @iain

Mungkin saya harus menulis sesuatu tentang motivasi tentang pertanyaan ini: Saya mencoba membandingkan ssd saya dan membandingkan beberapa solusi enkripsi. Tapi itu pertanyaan lain ( Cara terbaik untuk membandingkan berbagai solusi enkripsi pada sistem saya ). Saat berselancar di web tentang SSD dan pembandingan saya sering melihat pengguna memposting hasil CrystelDiskMark mereka di forum. Jadi ini adalah satu-satunya motivasi untuk pertanyaan itu. Saya hanya ingin melakukan hal yang sama di linux. Untuk pembandingan khusus saya lihat pertanyaan saya yang lain.

mahasiswa
sumber
Mengapa Anda tidak menggunakan alat pembandingan, yang berfungsi pada kedua sistem?
Alko
Menemukan ini, tampaknya sangat berguna dan dalam pengujian singkat saya pada tiga drive terpisah memberikan angka yang sangat mirip dengan crystaldiskmark yang sebenarnya ... github.com/buty4649/fio-cdm
ljwobker
2019: Q ini layak memulai baru - topik penting, tetapi sedikit kehilangan fokusnya di sini. "Terima dan arsipkan".
rastafile

Jawaban:

22

Menurut saya fio tidak akan kesulitan menghasilkan beban kerja itu. Perhatikan bahwa meskipun namanya CrystalDiskMark sebenarnya adalah tolok ukur sistem file pada disk tertentu - tidak dapat melakukan I / O mentah ke disk saja. Karena itu ia akan selalu memiliki overhead filesystem di dalamnya (tidak harus hal yang buruk tetapi sesuatu yang harus diperhatikan misalnya karena filesystem yang sedang dibandingkan mungkin tidak sama).

Contoh yang didasarkan pada mereplikasi output pada tangkapan layar di atas ditambah dengan informasi dari manual CrystalDiskMark (ini tidak lengkap tetapi harus memberikan gambaran umum):

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 

HATI - HATI - contoh ini secara permanen menghancurkan data /mnt/fs/fiotest.tmp!

Daftar parameter fio dapat dilihat di http://fio.readthedocs.io/en/latest/fio_doc.html .

Segera
sumber
3
Saya mencoba fio di Ubuntu 16.04 dan CrystalDiskMark di Windows 7. Beberapa nomor cocok sementara yang lain tidak. Sekuensial r / w dimatikan oleh faktor 2. Artinya, nilai-nilai Linux adalah 50% dari yang dilaporkan oleh CDM v3.0.4 (catatan: versi saat ini adalah 6.0.0, tetapi versi lama masih tersedia untuk diunduh). Untuk mengotak-atik perbedaan, saya mengatur bs = 4m bukannya 1m. Itu membuat angka lebih dekat. Berusaha 8m dan 32m membuatnya semakin dekat. Akhirnya seperti kata Anon jawabannya tidak lengkap dan seperti @Alko, kita membutuhkan alat yang sama di kedua OS. Perhatikan juga CDM 6 terbaru menggunakan tes yang berbeda dari OP. Info bagus Anon
Vahid Pazirandeh
2
@VahidPazirandeh Menarik, github.com/buty4649/fio-cdm/blob/master/fio-cdm memiliki pengaturan 1m yang sama, mungkin dokumentasi cdm tidak cukup baik.
inf3rno
@ vahid-pazirandeh Sama-sama. NB: jika Anda ingin alat yang sama pada kedua OS perhatikan bahwa ada versi fio untuk Windows juga.
Anon
8

Saya membuat skrip yang mencoba untuk meniru perilaku crystaldiskmark dengan fio. Script melakukan semua tes yang tersedia dalam berbagai versi crystaldiskmark hingga crystaldiskmark 6 termasuk tes 512K dan 4KQ8T8.

Script tergantung pada fio dan df . Jika Anda tidak ingin menginstal df, hapus baris 19 hingga 21 (skrip tidak akan lagi menampilkan drive mana yang sedang diuji) atau coba versi modifikasi dari komentator . (Mungkin juga memecahkan masalah lain yang mungkin terjadi)

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

Yang akan menampilkan hasil seperti ini:

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

(Hasilnya kode warna, untuk menghapus kode warna, hapus semua instance \033[x;xxm(di mana x adalah angka) dari perintah gema di bagian bawah skrip.)

Script saat dijalankan tanpa argumen akan menguji kecepatan drive / partisi rumah Anda. Anda juga dapat memasukkan jalur ke direktori di hard drive lain jika Anda ingin mengujinya. Saat menjalankan skrip, buat file sementara tersembunyi di direktori target yang dibersihkan setelah selesai berjalan (.fiomark.tmp dan .fiomark.txt)

Anda tidak dapat melihat hasil tes setelah selesai, tetapi jika Anda membatalkan perintah saat sedang berjalan sebelum menyelesaikan semua tes, Anda akan bisa melihat hasil tes yang selesai dan file sementara akan dihapus setelahnya juga.

Setelah beberapa penelitian, saya menemukan bahwa hasil benchmark kristaldiskmark pada model drive yang sama karena saya tampaknya relatif cocok dengan hasil benchmark fio ini, setidaknya sekilas. Karena saya tidak memiliki instalasi windows saya tidak dapat memverifikasi seberapa dekat mereka sebenarnya pada drive yang sama.

Perhatikan bahwa Anda terkadang mendapatkan hasil yang sedikit, terutama jika Anda melakukan sesuatu di latar belakang saat tes sedang berjalan, jadi sebaiknya lakukan tes dua kali berturut-turut untuk membandingkan hasil.

Tes-tes ini membutuhkan waktu lama untuk dijalankan. Pengaturan default dalam skrip saat ini cocok untuk SSD (SATA) biasa.

Pengaturan SIZE yang disarankan untuk drive yang berbeda:

  • (SATA) SSD: 1024 (default)
  • (ANY) HDD: 256
  • (High End NVME) SSD: 4096
  • (NVME Low-Mid End): 1024 (default)

NVME High End biasanya memiliki sekitar ~ 2GB / s kecepatan baca (Intel Optane dan Samsung 960 EVO adalah contoh; tetapi dalam kasus yang terakhir saya akan merekomendasikan 2048 bukan karena kecepatan 4kb lebih lambat.), Low-Mid End dapat memiliki di mana saja antara ~ 500-1800MB / s kecepatan baca.

Alasan utama mengapa ukuran ini harus disesuaikan adalah karena berapa lama tes akan mengambil sebaliknya, untuk HDD yang lebih tua / lemah misalnya, Anda dapat memiliki kecepatan membaca 0,4MB / s 4kb. Anda mencoba menunggu 5 loop 1GB pada kecepatan itu, tes 4kb lain biasanya memiliki kecepatan sekitar 1MB / s. Kami memiliki 6 dari mereka. Setiap menjalankan 5 loop, apakah Anda menunggu 30GB data ditransfer pada kecepatan itu? Atau apakah Anda ingin menurunkannya ke 7.5GB Data sebagai gantinya (pada 256MB / s itu adalah tes 2-3 jam)

Tentu saja, metode ideal untuk menangani situasi itu adalah dengan menjalankan tes sekuensial & 512k yang terpisah dari tes 4k (jadi jalankan tes sekuensial dan 512k dengan sesuatu seperti katakanlah 512m, dan kemudian jalankan tes 4k pada 32m)

Model HDD yang lebih baru adalah ujung yang lebih tinggi dan bisa mendapatkan hasil yang lebih baik dari itu.

Dan begitulah. Nikmati!

Pemeliharaan
sumber
Sudahkah Anda memeriksa bagaimana script Anda berlaku untuk Windows di Windows?
Anon
1
(Catatan untuk pembaca selain Cadangan: jika Anda membuat alat baru yang menggunakan fio maka jika mungkin jangan mengikis keluaran fio yang dapat dibaca manusia - gunakan --output-format=jsondan parsing JSON. Output yang dapat dibaca manusia Fio tidak dimaksudkan untuk mesin dan tidak stabil di antara versi fio. Lihat video YouTube ini tentang kasus di mana mengikis keluaran manusia fio menghasilkan hasil yang tidak diinginkan )
Anon
Terima kasih, saya akan mengingatnya, sayangnya saya tidak lagi memiliki instalasi windows jadi saya tidak dapat mengujinya ... tapi, saya memutuskan untuk mencari hasil crystaldiskmark untuk SSD saya dan sepertinya memori saya salah, karena hasilnya menambah apa yang saya dapatkan di fio setelah semua. Kesalahpahaman di pihak saya yang membuat saya berpikir hasilnya lebih lambat: / Saya akan memperbaikinya. Saya juga akan segera memperbarui jawaban ini untuk menggunakan output json untuk futureproofing, dan mungkin versi GUI (saya mulai mengerjakannya, tetapi gtkdialog tidak terdokumentasi dengan baik dan kemudahan terbatas sehingga saya mengalami kesulitan)
Cervation
1
@ Konservasi, skrip hebat, tetapi tidak berfungsi "di luar kotak" di CentOS7. Saya harus memodifikasinya sedikit.
Igor
1
@ Igor Menarik, ya saya membuatnya di manjaro dan saya tidak terlalu ahli di bash :) Saya sebutkan versi modifikasi Anda dalam jawaban kalau-kalau ada orang lain yang bermasalah.
Cadangan
5

Anda bisa menggunakan iozonedan bonnie. Mereka dapat melakukan apa yang dapat dilakukan tanda disk kristal dan banyak lagi.

Saya pribadi iozonebanyak menggunakan perangkat benchmark dan pengujian stres dari komputer pribadi ke sistem penyimpanan perusahaan. Ini memiliki mode otomatis yang melakukan segalanya tetapi Anda dapat menyesuaikannya dengan kebutuhan Anda.

bayindirh
sumber
5
Bagaimana cara mereproduksi dengan pengukuran kristalmark ini secara detail?
siswa
2
Saya akan mencoba yang terbaik untuk menulis howto, tetapi saya perlu daftar tes yang dilakukan Crystal Disk Mark. Apakah ada tes lain yang dijalankan perangkat lunak di samping yang terlihat pada tangkapan layar.
bayindirh
1
Hanya yang ada di tangkapan layar.
trr
1

Saya tidak yakin berbagai tes yang lebih mendalam masuk akal ketika mempertimbangkan apa yang Anda lakukan secara detail.

Pengaturan seperti ukuran blok, dan kedalaman antrian, adalah parameter untuk mengontrol parameter input / output level rendah dari antarmuka ATA tempat SSD Anda berada.

Itu semua baik dan bagus ketika Anda hanya menjalankan beberapa tes dasar terhadap drive secara langsung, seperti file besar dalam sistem file yang dipartisi sederhana.

Setelah Anda mulai berbicara tentang membuat tolok ukur suatu enk, parameter ini tidak terlalu berlaku untuk sistem file Anda lagi, sistem file hanyalah sebuah antarmuka menjadi sesuatu yang lain yang pada akhirnya kembali ke sistem file yang kembali ke drive.

Saya pikir akan sangat membantu untuk memahami apa sebenarnya yang Anda coba ukur, karena ada dua faktor yang berperan di sini - kecepatan IO disk mentah, yang dapat Anda uji dengan menghitung waktu berbagai perintah DD (dapat memberikan contoh jika ini yang Anda inginkan) inginkan) / tanpa / encfs, atau prosesnya akan dibatasi oleh enkripsi dan Anda mencoba untuk menguji throughput relatif dari algoritma enkripsi. Dalam hal ini parameter untuk kedalaman antrian dll tidak terlalu relevan.

Dalam kedua hal tersebut, perintah DD waktunya akan memberi Anda statistik throughput dasar yang Anda cari, tetapi Anda harus mempertimbangkan apa yang ingin Anda ukur dan parameter yang relevan untuk itu.

Tautan ini tampaknya memberikan panduan yang baik untuk pengujian kecepatan disk menggunakan perintah DD berwaktu termasuk cakupan yang diperlukan tentang 'mengalahkan buffer / cache' dan sebagainya. Kemungkinan ini akan memberikan informasi yang Anda butuhkan. Putuskan mana yang lebih Anda minati, kinerja disk, atau kinerja enkripsi, salah satunya adalah bottleneck, dan menyetel non-bottleneck tidak akan menguntungkan apa pun.

iain
sumber