Я создал скрипт, который пытается повторить поведение crystaldiskmark с fio. Скрипт выполняет все тесты, доступные в различных версиях crystaldiskmark вплоть до crystaldiskmark 6, включая тесты 512K и 4KQ8T8.
Сценарий зависит от 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
(где x - число) из команды echo в нижней части скрипта.)
Скрипт при запуске без аргументов проверит скорость вашего домашнего диска / раздела. Вы также можете ввести путь к каталогу на другом жестком диске, если вы хотите проверить это вместо этого. При запуске сценарий создает скрытые временные файлы в целевом каталоге, которые он очищает после завершения работы (.fiomark.tmp и .fiomark.txt)
Вы не можете видеть результаты теста по мере их завершения, но если вы отмените команду во время ее выполнения до того, как она завершит все тесты, вы увидите результаты завершенных тестов, а временные файлы также будут удалены впоследствии.
После некоторых исследований я обнаружил, что результаты теста CrystalDiskmark для той же модели диска, что и у меня, по-видимому, относительно близко соответствуют результатам этого теста FIO, по крайней мере, с первого взгляда. Поскольку у меня нет установки Windows, я не могу проверить, насколько точно они действительно находятся на одном диске.
Обратите внимание, что иногда вы можете слегка отклониться от результатов, особенно если вы выполняете какие-либо действия в фоновом режиме во время выполнения тестов, поэтому рекомендуется проводить тест два раза подряд для сравнения результатов.
Эти тесты занимают много времени. Настройки по умолчанию в скрипте в настоящее время подходят для обычного (SATA) SSD.
Рекомендуемая настройка размера для разных дисков:
- (SATA) SSD: 1024 (по умолчанию)
- (ЛЮБОЙ) HDD: 256
- (High End NVME) SSD: 4096
- (Low-Mid End NVME) SSD: 1024 (по умолчанию)
High End NVME обычно имеет скорость чтения ~ 2 ГБ / с (Intel Optane и Samsung 960 EVO являются примерами; но в последнем случае я бы рекомендовал 2048 вместо этого из-за более медленных скоростей 4 КБ.), Low-Mid End может иметь где-то между Скорость чтения ~ 500-1800МБ / с.
Основная причина, по которой эти размеры должны быть скорректированы, заключается в том, сколько времени потребуется для проведения тестов, например, для более старых / более слабых жестких дисков скорость чтения может составлять всего 0,4 МБ / с и 4 КБ. Вы пытаетесь подождать 5 циклов по 1 ГБ на этой скорости, другие тесты по 4 КБ обычно имеют скорость около 1 МБ / с. У нас их 6 Каждый из которых работает по 5 циклов, ждете ли вы 30 ГБ данных для передачи на этих скоростях? Или вы хотите уменьшить это значение до 7,5 ГБ данных (при 256 МБ / с это 2-3-часовой тест)
Конечно, идеальный метод для решения этой ситуации - запуск последовательных тестов и тестов по 512 Кб отдельно от тестов по 4 Кб (поэтому выполните последовательные тесты и тесты по 512 Кб с чем-то вроде, скажем, 512 м, а затем выполните тесты по 4 Кб на 32 м)
Более поздние модели жестких дисков более высокого класса и могут получить гораздо лучшие результаты, чем это.
И там у вас есть это. Наслаждайтесь!