Tôi đã tạo ra một kịch bản cố gắng tái tạo hành vi của Crystaldiskmark với fio. Kịch bản thực hiện tất cả các thử nghiệm có sẵn trong các phiên bản khác nhau của Crystaldiskmark cho đến Crystaldiskmark 6 bao gồm các thử nghiệm 512K và 4KQ8T8.
Kịch bản phụ thuộc vào fio và df . Nếu bạn không muốn cài đặt df, hãy xóa dòng 19 đến 21 (tập lệnh sẽ không còn hiển thị ổ đĩa nào đang được kiểm tra) hoặc thử phiên bản sửa đổi từ một người bình luận . (Cũng có thể giải quyết các vấn đề khác có thể)
#!/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
Mà sẽ cho kết quả như thế này:
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
(Các kết quả được mã hóa màu, để loại bỏ mã màu, loại bỏ tất cả các trường hợp \033[x;xxm
(trong đó x là một số) khỏi lệnh echo ở dưới cùng của tập lệnh.)
Kịch bản khi chạy mà không có đối số sẽ kiểm tra tốc độ của ổ đĩa / phân vùng nhà của bạn. Bạn cũng có thể nhập một đường dẫn đến một thư mục trên một ổ cứng khác nếu bạn muốn kiểm tra điều đó thay vào đó. Trong khi chạy tập lệnh sẽ tạo các tệp tạm thời bị ẩn trong thư mục đích mà nó sẽ dọn sạch sau khi chạy xong (.fiomark.tmp và .fiomark.txt)
Bạn không thể xem kết quả kiểm tra khi chúng hoàn thành, nhưng nếu bạn hủy lệnh trong khi nó đang chạy trước khi hoàn thành tất cả các bài kiểm tra, bạn sẽ thấy kết quả của các bài kiểm tra đã hoàn thành và các tệp tạm thời cũng sẽ bị xóa.
Sau một số nghiên cứu, tôi thấy rằng kết quả điểm chuẩn Crystaldiskmark trên cùng một mô hình ổ đĩa mà tôi dường như tương đối gần với kết quả của điểm chuẩn fio này, ít nhất là trong nháy mắt. Vì tôi không có cài đặt windows nên tôi không thể xác minh mức độ thực sự của chúng trên cùng một ổ đĩa.
Lưu ý rằng đôi khi bạn có thể nhận được một chút kết quả, đặc biệt nếu bạn đang làm gì đó trong nền trong khi các bài kiểm tra đang chạy, do đó, chạy thử nghiệm hai lần liên tiếp để so sánh kết quả là điều nên làm.
Những bài kiểm tra này mất một thời gian để chạy. Các cài đặt mặc định trong tập lệnh hiện phù hợp với SSD thông thường (SATA).
Cài đặt SIZE được đề xuất cho các ổ đĩa khác nhau:
- (SATA) SSD: 1024 (mặc định)
- (BẤT K)) Ổ cứng: 256
- (NVME cao cấp) SSD: 4096
- Ổ SSD (NVME cấp thấp): 1024 (mặc định)
Một NVME High End thường có tốc độ đọc khoảng ~ 2GB / giây (Intel Optane và Samsung 960 EVO là ví dụ; nhưng trong trường hợp sau, tôi muốn giới thiệu 2048 thay vì tốc độ 4kb chậm hơn.), Low-Mid End có thể có bất cứ nơi nào giữa ~ 500-1800MB / s tốc độ đọc.
Lý do chính tại sao các kích thước này phải được điều chỉnh là do các thử nghiệm sẽ mất bao lâu, ví dụ, đối với các ổ cứng cũ / yếu hơn, bạn có thể có tốc độ Đọc thấp tới 0,4 MB / giây. Bạn thử chờ 5 vòng 1GB ở tốc độ đó, các bài kiểm tra 4kb khác thường có tốc độ khoảng 1MB / s. Chúng tôi có 6 người trong số họ. Mỗi vòng chạy 5 vòng, bạn có đợi 30 GB dữ liệu được truyền ở các tốc độ đó không? Hoặc bạn muốn hạ thấp xuống 7,5 GB dữ liệu thay vào đó (ở mức 256 MB / giây, đó là thử nghiệm 2-3 giờ)
Tất nhiên, phương pháp lý tưởng để xử lý tình huống đó là chạy các bài kiểm tra tuần tự & 512k tách biệt với các bài kiểm tra 4k (vì vậy hãy chạy các bài kiểm tra tuần tự và 512k với nội dung như 512m, rồi chạy các bài kiểm tra 4k ở 32m)
Nhiều mô hình ổ cứng gần đây là cao cấp hơn và có thể nhận được kết quả tốt hơn nhiều.
Và bạn có nó rồi đấy! Thưởng thức!