ฉันสร้างสคริปต์ที่พยายามทำซ้ำพฤติกรรมของ crystaldiskmark ด้วย fio สคริปต์ทำการทดสอบทั้งหมดที่มีใน Crystaldiskmark เวอร์ชันต่างๆจนถึง Crystaldiskmark 6 รวมถึงการทดสอบ 512K และ 4KQ8T8
สคริปต์ขึ้นอยู่กับFiOและDF หากคุณไม่ต้องการที่จะติดตั้ง DF ลบ line 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
(โดยที่ x คือตัวเลข) จากคำสั่ง echo ที่ด้านล่างของสคริปต์)
สคริปต์เมื่อทำงานโดยไม่มีข้อโต้แย้งจะทดสอบความเร็วของไดรฟ์ / พาร์ติชันภายในบ้านของคุณ นอกจากนี้คุณยังสามารถป้อนเส้นทางไปยังไดเรกทอรีในฮาร์ดไดรฟ์อื่นหากคุณต้องการทดสอบแทน ในขณะที่เรียกใช้สคริปต์จะสร้างไฟล์ชั่วคราวที่ซ่อนอยู่ในไดเรกทอรีเป้าหมายซึ่งจะล้างข้อมูลหลังจากรันเสร็จสิ้น (.fiomark.tmp และ. fiomark.txt)
คุณไม่สามารถเห็นผลการทดสอบเมื่อเสร็จสมบูรณ์ แต่ถ้าคุณยกเลิกคำสั่งในขณะที่มันกำลังทำงานก่อนที่จะเสร็จสิ้นการทดสอบทั้งหมดคุณจะได้เห็นผลลัพธ์ของการทดสอบที่เสร็จสมบูรณ์และไฟล์ชั่วคราวจะถูกลบในภายหลังเช่นกัน
หลังจากการวิจัยบางอย่างฉันพบว่า Crystaldiskmark benchmark ผลลัพธ์ในไดรฟ์รุ่นเดียวกันกับที่ฉันดูเหมือนจะค่อนข้างตรงกับผลลัพธ์ของ fio benchmark อย่างน้อยคร่าว ๆ เนื่องจากฉันไม่มีการติดตั้ง windows ฉันจึงไม่สามารถตรวจสอบว่ามีความใกล้ชิดกับไดรฟ์เดียวกันได้อย่างไร
โปรดทราบว่าบางครั้งคุณอาจได้รับผลลัพธ์เล็กน้อยโดยเฉพาะอย่างยิ่งถ้าคุณกำลังทำอะไรบางอย่างในพื้นหลังในขณะที่การทดสอบกำลังทำงานอยู่ดังนั้นให้รันการทดสอบสองครั้งติดต่อกันเพื่อเปรียบเทียบผลลัพธ์
การทดสอบเหล่านี้ใช้เวลาในการรันนาน การตั้งค่าเริ่มต้นในสคริปต์ปัจจุบันเหมาะสำหรับ SSD (SATA) ปกติ
ขนาด SI ที่แนะนำสำหรับไดรฟ์ต่าง ๆ :
- (SATA) SSD: 1024 (ค่าเริ่มต้น)
- (ANY) HDD: 256
- (High End NVME) SSD: 4096
- (NVME ต่ำสุดระดับกลาง) SSD: 1024 (ค่าเริ่มต้น)
โดยทั่วไปแล้ว High End NVME จะมีความเร็วในการอ่านประมาณ ~ 2GB / s (Intel Optane และ Samsung 960 EVO เป็นตัวอย่าง แต่ในกรณีหลังฉันจะแนะนำ 2048 แทนเนื่องจากความเร็ว 4kb ช้าลง) Low-Mid End สามารถอยู่ที่ใดก็ได้ระหว่าง ความเร็วในการอ่านประมาณ 500-1800MB / s
เหตุผลหลักว่าทำไมควรปรับขนาดเหล่านี้เป็นเพราะระยะเวลาการทดสอบจะใช้เป็นอย่างอื่นสำหรับ HDD ที่เก่ากว่าหรืออ่อนแอกว่าคุณสามารถมีความเร็วในการอ่านที่ต่ำเพียง 0.4MB / s 4kb คุณลองรอ 5 ลูปของ 1GB ที่ความเร็วนั้นโดยทั่วไปการทดสอบ 4kb อื่น ๆ จะมีความเร็วประมาณ 1MB / s เรามี 6 คน แต่ละลูปที่มีการทำงาน 5 ลูปคุณจะรอให้มีการถ่ายโอนข้อมูล 30GB ด้วยความเร็วเหล่านั้นหรือไม่? หรือคุณต้องการลดให้เหลือ 7.5GB ของข้อมูลแทน (ที่ 256MB / s เป็นการทดสอบ 2-3 ชั่วโมง)
แน่นอนว่าวิธีที่ดีที่สุดสำหรับการจัดการสถานการณ์นั้นคือการรันการทดสอบตามลำดับ & 512k แยกจากการทดสอบ 4k (ดังนั้นให้รันการทดสอบตามลำดับและ 512k ด้วยสิ่งที่คล้ายพูด 512m แล้วทำการทดสอบ 4k ที่ 32m)
รุ่น HDD ที่ใหม่กว่านั้นมีระดับที่สูงกว่าและสามารถได้ผลลัพธ์ที่ดีกว่านั้นมาก
และคุณมีมัน สนุก!