crystaldiskmark의 동작을 fio로 복제하는 스크립트를 만들었습니다. 이 스크립트는 512K 및 4KQ8T8 테스트를 포함하여 crystaldiskmark 6까지 다양한 버전의 crystaldiskmark에서 사용 가능한 모든 테스트를 수행합니다.
스크립트는 fio 및 df 에 따라 다릅니다 . 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)
완료된 테스트 결과는 볼 수 없지만 모든 테스트를 완료하기 전에 명령이 실행되는 동안 명령을 취소하면 완료된 테스트 결과가 표시되고 임시 파일도 나중에 삭제됩니다.
연구 결과, 적어도 한 눈에이 fio 벤치 마크의 결과와 비교적 근접한 것으로 보이는 것과 동일한 드라이브 모델에서 crystaldiskmark 벤치 마크 결과가 발견되었습니다. Windows 설치가 없으므로 동일한 드라이브에서 실제로 얼마나 가까운 지 확인할 수 없습니다.
특히 테스트가 실행되는 동안 백그라운드에서 무언가를 수행하는 경우 결과가 약간 떨어질 수 있으므로 테스트를 두 번 연속 실행하여 결과를 비교하는 것이 좋습니다.
이 테스트는 실행하는 데 오랜 시간이 걸립니다. 스크립트의 기본 설정은 현재 일반 (SATA) SSD에 적합합니다.
다른 드라이브에 권장되는 크기 설정 :
- (SATA) SSD : 1024 (기본)
- (모든) HDD : 256
- (고급 NVME) SSD : 4096
- (중저가 NVME) SSD : 1024 (기본값)
High-End NVME는 일반적으로 약 2GB / s의 읽기 속도를 갖습니다 (Intel Optane 및 Samsung 960 EVO가 예입니다. 후자의 경우 느린 4kb 속도로 인해 2048을 권장합니다). Low-Mid End는 ~ 500-1800MB / s의 읽기 속도.
이러한 크기를 조정해야하는 주된 이유는 테스트가 오래 걸리거나 더 오래된 HDD의 경우 예를 들어 0.4MB / s 4kb의 읽기 속도를 가질 수 있기 때문에 테스트 시간이 오래 걸리기 때문입니다. 해당 속도에서 1GB의 5 루프를 기다리려고 시도하지만 다른 4kb 테스트는 일반적으로 약 1MB / s 속도입니다. 6 개가 있습니다. 각 5 개의 루프를 실행하면 30GB의 데이터가 해당 속도로 전송 될 때까지 기다리십니까? 또는 대신 7.5GB의 데이터로 낮추고 싶습니까 (256MB / s에서 2-3 시간 테스트입니다)
물론 이러한 상황을 처리하는 이상적인 방법은 4k 테스트와 별도로 순차적 및 512k 테스트를 실행하는 것입니다 (따라서 512m과 같은 순서로 순차적 및 512k 테스트를 실행 한 다음 32m에서 4k 테스트를 실행하십시오)
최신 HDD 모델은 고급형이지만 그보다 훨씬 더 나은 결과를 얻을 수 있습니다.
그리고 거기 있습니다. 즐겨!