Я хочу протестировать SSD (возможно, с зашифрованными файловыми системами) и сравнить результаты с тестами, выполненными CrystalDiskMark в Windows.
Так как же мне измерить примерно те же вещи, что и crystaldiskmark?
Для первой строки (Seq) я думаю, я мог бы сделать что-то вроде
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
Но я не уверен в dd
параметрах.
Для случайных 512КБ, 4КБ, 4КБ (глубина очереди = 32) скоростных тестов чтения/записи я понятия не имею, как воспроизвести измерения в Linux? Так как же мне это сделать?
Для тестирования скорости чтения что-то вроде этого sudo hdparm -Tt /dev/sda
не имеет смысла, так как я хочу, например, протестировать что-то вроде encfs
mounts.
Редактировать
@Алко, @иайн
Возможно, мне стоит написать что-то о мотивации этого вопроса: я пытаюсь протестировать свой ssd и сравнить некоторые решения по шифрованию. Но это уже другой вопрос (Лучший способ сравнить различные решения по шифрованию в моей системе). Во время серфинга в Интернете по поводу SSD и бенчмаркинга я часто видел, как пользователи выкладывали свои результаты CrystelDiskMark на форумах. Так что это единственная причина для вопроса. Я просто хочу сделать то же самое на Linux. Для моего конкретного бенчмаркинга см. мой другой вопрос.
решение1
я бы сказалфионе будет иметь никаких проблем с созданием этих рабочих нагрузок. Обратите внимание, что несмотря на свое название CrystalDiskMark на самом деле является бенчмарком файловой системы на определенном диске - он не может выполнять ввод-вывод только на диск. Таким образом, он всегда будет иметь накладные расходы файловой системы (не обязательно плохо, но о чем следует знать, например, потому что сравниваемые файловые системы могут быть разными).
Пример, основанный на воспроизведении выходных данных, представленных на снимке экрана выше, дополненных информацией изРуководство по CrystalDiskMark(это не полный текст, но он должен дать общее представление):
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
БУДЬ ОСТОРОЖЕН- этот примерпостоянноуничтожает данные в /mnt/fs/fiotest.tmp
!
Список параметров fio можно увидеть наhttp://fio.readthedocs.io/en/latest/fio_doc.html.
решение2
Оригинальный ответ:https://unix.stackexchange.com/revisions/480191/12
Я создал скрипт, который пытается воспроизвести поведение crystaldiskmark 6 с fio, а также добавил поддержку старых тестов (например, теста 512kb), этот ответ обновлен, хотя я и создал его давно, в скрипте есть очень нужные улучшения. Включен журнал изменений для тех, кто использовал более ранние версии.
Сценарий зависит отфиоидф. Если у вас нет или вы не хотите устанавливать df, скрипт все равно должен работать. Скрипт совместим с dash (если вы хотите использовать dash, измените #!/bin/bash на #!/bin/dash), но учтите, что в dash нет поддержки автозаполнения с командой read (поэтому вам придется прописывать путь к месту, где вы хотите проверить, буква за буквой, если вы используете dash).
Вот полный сценарий:
#!/bin/bash
#############################################################################################################
#Changelog #
#############################################################################################################
#Added prompts for user input to configure script instead of relying on hardcoded settings.
#Added a lot of errorchecking
#The script is now optionally compatible with dash (this is the reason for there being a sed command at the end of every echo -e instance, dash liked to print the -e part when I was testing.)
#Vastly improved compatibility across distributions
#Special thanks to everyone who contributed here: https://gist.github.com/i3v/99f8ef6c757a5b8e9046b8a47f3a9d5b
#Also extra special thanks to BAGELreflex on github for this: https://gist.github.com/BAGELreflex/c04e7a25d64e989cbd9376a9134b8f6d it made a huge difference to this improved version.
#Added optimizations for 512k and 4k tests (they now use QSIZE instead of SIZE, it makes these tests a lot faster and doesn't affect accuracy much, assuming SIZE is appropriately configured for your drive.)
#Added option to not use legacy (512k and Q1T1 Seq R/W tests) to save time when testing.
#Ensured the script can run fine without df installed now. Some information may be missing but worst case scenario it'll just look ugly.
#Added a save results option that imitates the saved results from crystaldiskmark; the formatting is a little wonky but it checks out. Great for comparing results between operating systems.
#Reconfigured results to use MegaBytes instead of MebiBytes (This is what crystaldiskmark uses so results should now be marginally closer).
#Sequential read/write results (512k, q1t1 seq and q32t1 seq) will now appear as soon as they're finished and can be viewed while the 4k tests are running.
#Note: The legacy test option defaults to no if nothing is selected, the result saving defaults to yes. It's easy to change if you don't like this.
#Observation: When testing, I observed that the read results seemed mostly consistent with the results I got from crystaldiskmark on windows, however there's something off with the write results.
#Sorry for the messy code :)
#############################################################################################################
#User input requests and error checking #
#############################################################################################################
if [ -f /usr/bin/fio ]; then #Dependency check
:
else
echo -e "\033[1;31mError: This script requires fio to run, please make sure it is installed." | sed 's:-e::g'
exit
fi
if [ -f /usr/bin/df ]; then #Dependency check
nodf=0
else
nodf=1
echo -e "\033[1;31mWarning: df is not installed, this script relies on df to display certain information, some information may be missing." | sed 's:-e::g'
fi
if [ "$(ps -ocmd= | tail -1)" = "bash" ]; then
echo "What drive do you want to test? (Default: $HOME on /dev/$(df $HOME | grep /dev | cut -d/ -f3 | cut -d" " -f1) )"
echo -e "\033[0;33mOnly directory paths (e.g. /home/user/) are valid targets.\033[0;00m"
read -e TARGET
else #no autocomplete available for dash.
echo "What drive do you want to test? (Default: $HOME on /dev/$(df $HOME | grep /dev | cut -d/ -f3 | cut -d" " -f1) )"
echo -e "\033[0;33mOnly directory paths (e.g. /home/user/) are valid targets. Use bash if you want autocomplete.\033[0;00m" | sed 's:-e::g'
read TARGET
fi
echo "
How many times to run the test? (Default: 5)"
read LOOPS
echo "How large should each test be in MiB? (Default: 1024)"
echo -e "\033[0;33mOnly multiples of 32 are permitted!\033[0;00m" | sed 's:-e::g'
read SIZE
echo "Do you want to write only zeroes to your test files to imitate dd benchmarks? (Default: 0)"
echo -e "\033[0;33mEnabling this setting may drastically alter your results, not recommended unless you know what you're doing.\033[0;00m" | sed 's:-e::g'
read WRITEZERO
echo "Would you like to include legacy tests (512kb & Q1T1 Sequential Read/Write)? [Y/N]"
read LEGACY
if [ -z $TARGET ]; then
TARGET=$HOME
elif [ -d $TARGET ]; then
:
else
echo -e "\033[1;31mError: $TARGET is not a valid path."
exit
fi
if [ -z $LOOPS ]; then
LOOPS=5
elif [ "$LOOPS" -eq "$LOOPS" ] 2>/dev/null; then
:
else
echo -e "\033[1;31mError: $LOOPS is not a valid number, please use a number to declare how many times to loop tests." | sed 's:-e::g'
exit
fi
if [ -z $SIZE ]; then
SIZE=1024
elif [ "$SIZE" -eq "$SIZE" ] 2>/dev/null && ! (( $SIZE % 32 )) 2>/dev/null;then
:
else
echo -e "\033[1;31mError: The test size must be an integer set to a multiple of 32. Please write a multiple of 32 for the size setting (Optimal settings: 1024, 2048, 4096, 8192, 16384)."
exit
fi
if [ -z $WRITEZERO ]; then
WRITEZERO=0
elif [ "$WRITEZERO" -eq 1 ] 2>/dev/null || [ "$WRITEZERO" -eq 0 ] 2>/dev/null; then
:
else
echo -e "\033[1;31mError: WRITEZERO only accepts 0 or 1, $WRITEZERO is not a valid argument." | sed 's:-e::g'
exit
fi
if [ "$LEGACY" = "Y" ] || [ "$LEGACY" = "y" ]; then
:
else
LEGACY=no
fi
if [ $nodf = 1 ]; then
echo "
Settings are as follows:
Target Directory: $TARGET
Size Of Test: $SIZE MiB
Number Of Loops: $LOOPS
Write Zeroes: $WRITEZERO
Legacy Tests: $LEGACY
"
echo "Are you sure these are correct? [Y/N]"
read REPLY
if [ $REPLY = Y ] || [ $REPLY = y ]; then
REPLY=""
else
echo ""
exit
fi
else
DRIVE=$(df $TARGET | grep /dev | cut -d/ -f3 | cut -d" " -f1 | rev | cut -c 2- | rev)
if [ "$(echo $DRIVE | cut -c -4)" = "nvme" ]; then #NVME Compatibility
echo $DRIVE
DRIVE=$(df $TARGET | grep /dev | cut -d/ -f3 | cut -d" " -f1 | rev | cut -c 3- | rev)
echo $DRIVE
fi
DRIVEMODEL=$(cat /sys/block/$DRIVE/device/model | sed 's/ *$//g')
DRIVESIZE=$(($(cat /sys/block/$DRIVE/size)*512/1024/1024/1024))GB
DRIVEPERCENT=$(df -h $TARGET | cut -d ' ' -f11 | tail -n 1)
DRIVEUSED=$(df -h $TARGET | cut -d ' ' -f6 | tail -n 1)
echo "
Settings are as follows:
Target Directory: $TARGET
Target Drive: $DRIVE
Size Of Test: $SIZE MiB
Number Of Loops: $LOOPS
Write Zeroes: $WRITEZERO
Legacy Tests: $LEGACY
"
echo "Are you sure these are correct? [Y/N]"
read REPLY
if [ "$REPLY" = "Y" ] || [ "$REPLY" = "y" ]; then
REPLY=""
else
echo ""
exit
fi
fi
#############################################################################################################
#Setting the last Variables And Running Sequential R/W Benchmarks #
#############################################################################################################
QSIZE=$(($SIZE / 32)) #Size of Q32Seq tests
SIZE=$(echo $SIZE)m
QSIZE=$(echo $QSIZE)m
if [ $nodf = 1 ]; then
echo "
Running Benchmark, please wait...
"
else
echo "
Running Benchmark on: /dev/$DRIVE, $DRIVEMODEL ($DRIVESIZE), please wait...
"
fi
if [ $LEGACY = Y ] || [ $LEGACY = y ]; then
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=SeqQ32T1read --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=read \
--name=SeqQ32T1write --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=write \
> "$TARGET/.fiomark.txt"
fio --loops=$LOOPS --size=$QSIZE --filename="$TARGET/.fiomark-512k.tmp" --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
--name=512kread --bs=512k --iodepth=1 --numjobs=1 --rw=read \
--name=512kwrite --bs=512k --iodepth=1 --numjobs=1 --rw=write \
> "$TARGET/.fiomark-512k.txt"
SEQR="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "Seqread"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "Seqread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
SEQW="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "Seqwrite"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "Seqwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
F12KR="$(($(cat "$TARGET/.fiomark-512k.txt" | grep -A15 '"name" : "512kread"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark-512k.txt" | grep -A15 '"name" : "512kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
F12KW="$(($(cat "$TARGET/.fiomark-512k.txt" | grep -A80 '"name" : "512kwrite"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark-512k.txt" | grep -A80 '"name" : "512kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
SEQ32R="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
SEQ32W="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
echo -e "
Results:
\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" | sed 's:-e::g'
else
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=SeqQ32T1read --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=read \
--name=SeqQ32T1write --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=write \
> "$TARGET/.fiomark.txt"
SEQ32R="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
SEQ32W="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
echo -e "
Results:
\033[1;36m
Sequential Q32T1 Read: $SEQ32R
Sequential Q32T1 Write: $SEQ32W" | sed 's:-e::g'
fi
#############################################################################################################
#4KiB Tests & Results #
#############################################################################################################
fio --loops=$LOOPS --size=$QSIZE --filename="$TARGET/.fiomark-4k.tmp" --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
--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-4k.txt"
FKR="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kread"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
FKW="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kwrite"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
FK32R="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ32T1read"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
FK32W="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ32T1write"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1000))MB/s [ $(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g') IOPS]"
FK8R="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ8T8read"' | grep bw | grep -v '_' | sed 's/ "bw" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1000))MB/s [ $(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ8T8read"' | grep iops | sed 's/ "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1) IOPS]"
FK8W="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ8T8write"' | grep bw | sed 's/ "bw" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1000))MB/s [ $(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ8T8write"' | grep '"iops" '| sed 's/ "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1) IOPS]"
echo -e "\033[1;35m
4KB Q8T8 Read: $FK8R
4KB Q8T8 Write: $FK8W
\033[1;33m
4KB Q32T1 Read: $FK32R
4KB Q32T1 Write: $FK32W
\033[0;36m
4KB Read: $FKR
4KB Write: $FKW
\033[0m
" | sed 's:-e::g'
echo "Would you like to save these results? [Y/N]"
read REPLY
if [ "$REPLY" = "N" ] || [ "$REPLY" = "n" ]; then
REPLY=""
else
DRIVESIZE=$(df -h $TARGET | cut -d ' ' -f3 | tail -n 1)
echo "
Saving at $HOME/$DRIVE$(date +%F%I%M%S).txt
"
if [ "$LEGACY" = "Y" ] || [ "$LEGACY" = "y" ]; then
echo "-----------------------------------------------------------------------
Flexible I/O Tester - $(fio --version) (C) axboe
Fio Github : https://github.com/axboe/fio
Script Source : https://unix.stackexchange.com/a/480191/72554
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s
* KB = 1000 bytes, KiB = 1024 bytes
Legacy Seq Read (Q= 1,T= 1) : $SEQR
Legacy Seq Write (Q= 1,T= 1) : $SEQW
512KiB Seq Read (Q= 1,T= 1) : $F12KR
512KiB Seq Write (Q= 1,T= 1) : $F12KW
Sequential Read (Q= 32,T= 1) : $SEQ32R
Sequential Write (Q= 32,T= 1) : $SEQ32W
Random Read 4KiB (Q= 8,T= 8) : $FK8R
Random Write 4KiB (Q= 8,T= 8) : $FK8W
Random Read 4KiB (Q= 32,T= 1) : $FK32R
Random Write 4KiB (Q= 32,T= 1) : $FK32W
Random Read 4KiB (Q= 1,T= 1) : $FKR
Random Write 4KiB (Q= 1,T= 1) : $FKW
Test : $(echo $SIZE | rev | cut -c 2- | rev) MiB [$DRIVEMODEL, $DRIVE $DRIVEPERCENT ($(echo $DRIVEUSED | rev | cut -c 2- | rev)/$(echo $DRIVESIZE | rev | cut -c 2- | rev) GiB] (x$LOOPS) [Interval=0 sec]
Date : $(date +%F | sed 's:-:/:g') $(date +%T)
OS : $(uname -srm)
" > "$HOME/$DRIVE$(date +%F%I%M%S).txt"
else
echo "-----------------------------------------------------------------------
Flexible I/O Tester - $(fio --version) (C) axboe
Fio Github : https://github.com/axboe/fio
Script Source : https://unix.stackexchange.com/a/480191/72554
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s
* KB = 1000 bytes, KiB = 1024 bytes
Sequential Read (Q= 32,T= 1) : $SEQ32R
Sequential Write (Q= 32,T= 1) : $SEQ32W
Random Read 4KiB (Q= 8,T= 8) : $FK8R
Random Write 4KiB (Q= 8,T= 8) : $FK8W
Random Read 4KiB (Q= 32,T= 1) : $FK32R
Random Write 4KiB (Q= 32,T= 1) : $FK32W
Random Read 4KiB (Q= 1,T= 1) : $FKR
Random Write 4KiB (Q= 1,T= 1) : $FKW
Test : $(echo $SIZE | rev | cut -c 2- | rev) MiB [$DRIVEMODEL, $DRIVE $DRIVEPERCENT ($(echo $DRIVEUSED | rev | cut -c 2- | rev)/$(echo $DRIVESIZE | rev | cut -c 2- | rev) GiB] (x$LOOPS) [Interval=0 sec]
Date : $(date +%F | sed 's:-:/:g') $(date +%T)
OS : $(uname -srm)
" > "$HOME/$DRIVE$(date +%F%I%M%S).txt"
fi
fi
rm "$TARGET/.fiomark.txt" "$TARGET/.fiomark-512k.txt" "$TARGET/.fiomark-4k.txt" 2>/dev/null
rm "$TARGET/.fiomark.tmp" "$TARGET/.fiomark-512k.tmp" "$TARGET/.fiomark-4k.tmp" 2>/dev/null
Что выведет такие результаты:
Running Benchmark on: /dev/nvme0n1, KINGSTON RBUSNS8154P3256GJ (238GB), please wait...
Results:
Sequential Read: 1337MB/s [ 5 IOPS]
Sequential Write: 266MB/s [ 1 IOPS]
512KB Read: 512MB/s [ 1000 IOPS]
512KB Write: 273MB/s [ 533 IOPS]
Sequential Q32T1 Read: 1394MB/s [ 170 IOPS]
Sequential Q32T1 Write: 265MB/s [ 32 IOPS]
4KB Q8T8 Read: 487MB/s [ 121835 IOPS]
4KB Q8T8 Write: 284MB/s [ 71085 IOPS]
4KB Q32T1 Read: 390MB/s [ 97523 IOPS]
4KB Q32T1 Write: 315MB/s [ 78769 IOPS]
4KB Read: 28MB/s [ 7135 IOPS]
4KB Write: 126MB/s [ 31507 IOPS]
Would you like to save these results? [Y/N]
(Результаты кодируются цветом при выполнении в терминале.)
Если вы решите сохранить результаты, будет выведена имитация того же файла сохранения, который создает crystaldiskmark при сохранении результатов.
Вот изображение, сравнивающее эти файлы с тремя тестами одного и того же диска: один с помощью crystaldiskmark и два со скриптом:
При запуске скрипта он попросит вас настроить его (варианты включают: Target Directory, Loops, Size, Write zeroes и Legacy tests), каждая настройка имеет значение по умолчанию, если вы ничего не введете. Чтобы протестировать определенный жесткий диск, вам нужно сначала смонтировать его, а затем ввести полный путь к каталогу на этом жестком диске в приглашении, которое спрашивает, какой диск вы хотите протестировать. Во время работы скрипт создает скрытые временные файлы в целевом каталоге, которые он очищает после завершения работы. Даже если вы отмените процесс во время его выполнения с помощью CTRL+C, он все равно должен очистить файлы.
Результаты теста отображаются в два этапа: последовательный и 4КБ, сначала выполняются последовательные тесты чтения/записи, и после их завершения они отображаются во время выполнения тестов 4КБ. Если вы отмените процесс до завершения тестов, любые частичные результаты будут отображены при выходе.
Обратите внимание, что иногда вы можете получать немного неверные результаты, особенно если вы делаете что-то в фоновом режиме во время выполнения тестов, поэтому рекомендуется запустить тест дважды подряд, чтобы сравнить результаты.
Эти тесты могут выполняться долго (хотя в новой версии скрипта это значительно улучшено). Настройки по умолчанию в скрипте в настоящее время подходят для обычного (SATA) SSD.
Рекомендуемые размеры для разных типов дисков:
- (SATA) SSD: 1024 (по умолчанию)
- (ЛЮБОЙ) HDD: 256
- (Высокопроизводительный NVME) SSD: 4096
- (Нижний-средний уровень M.2/NVME) SSD: 2048
Скорость чтения NVME высокого класса обычно составляет около ~2 ГБ/с (примерами являются Intel Optane и Samsung 960 EVO; но в случае последнего я бы рекомендовал 2048 из-за более низкой скорости чтения по 4 КБ), а скорость чтения NVME низкого и среднего класса может составлять от ~500 до 1800 МБ/с.
В новой версии скрипта тесты 4 КБ и 512 КБ будут выполняться значительно быстрее, поскольку они больше не используют фактический полный размер, определяемый пользователем. (Crystaldiskmark также будет экономить на размере для тестов 4 КБ, иначе они всегда выполнялись бы вечно).
Известные вопросы:
- В пути, используемом для выбора жесткого диска для тестирования, не должно быть пробелов.
- Если вы меня спросите, результаты тестов ntfs-3g выглядят крайне сомнительными.
Вот и все. Наслаждайтесь!
решение3
ПытатьсяKDiskMark, очень похож на CrystalDiskmark.
Приложение написано на C++ с использованием Qt ине имеет никакихЗависимости KDE.
Применение
Для начала выберите папку (и, при необходимости, другие параметры), нажмите All
.
Установить
Дистрибутивы на базе Ubuntu
sudo add-apt-repository ppa:jonmagon/kdiskmark
sudo apt update
sudo apt install kdiskmark
Дистрибутивы на базе Arch
KDiskMark включен в официальный репозиторий сообщества. Вы можете установить его как любой другой пакет:
sudo pacman -Syu kdiskmark
Версию для разработки можно установить из пакета AUR kdiskmark-git.
git clone https://aur.archlinux.org/kdiskmark-git.git
cd kdiskmark-git
makepkg -si
Федора
KDiskMark включен в официальный репозиторий Fedora. Вы можете установить его как любой другой пакет:
sudo dnf install kdiskmark
openSUSE Перекати-поле
sudo zypper install kdiskmark
решение4
ПытатьсяNetCoreStorageSpeedTest.
Возможно, он не совсем то же самое, что CrystalDiskMark, но его преимущество в поддерживаемых платформах:
Консольное приложение (Linux, Windows и MacOS - .NET Core 3) и кроссплатформенная библиотека классов (C#, .NET Standard 2) для измерения скорости чтения/записи дисков/устройств хранения данных.
Проект также поддерживает Android, как указано на егоСтраница проекта GitHub.