SSD(아마도 암호화된 파일 시스템 사용)를 벤치마킹하고 이를 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
.
무작위 512KB, 4KB, 4KB(큐 깊이 = 32) 읽기/쓰기 속도 테스트의 경우 Linux에서 측정 결과를 재현하는 방법을 모르겠습니다. 그럼 어떻게 해야 하나요?
설치와 같은 것을 벤치마킹하고 싶기 때문에 읽기 속도와 같은 것을 테스트하는 것은 sudo hdparm -Tt /dev/sda
의미가 없는 것 같습니다 encfs
.
편집하다
@알코, @iain
아마도 이 질문에 대한 몇 가지 동기를 적어야 할 것 같습니다. SSD를 벤치마킹하고 일부 암호화 솔루션을 비교하려고 합니다. 하지만 그건 또 다른 질문입니다(내 시스템에서 다양한 암호화 솔루션을 벤치마킹하는 가장 좋은 방법). SSD 및 벤치마크에 대한 정보를 찾기 위해 웹을 탐색하는 동안 사용자가 CrystalDiskMark 결과를 포럼에 게시하는 것을 자주 봅니다. 이것이 바로 이 질문의 유일한 동기입니다. 나는 리눅스에서도 같은 일을 하고 싶다. 내 특정 벤치마크에 대해서는 내 다른 질문을 참조하세요.
답변1
내가 말할 것페오이러한 워크로드를 생성하는 데 문제가 없습니다. 이름에도 불구하고 CrystalDiskMark는 실제로 특정 디스크의 파일 시스템에 대한 벤치마크 테스트이므로 디스크에만 원시 I/O를 수행할 수 없습니다. 따라서 항상 파일 시스템 오버헤드가 발생합니다(반드시 나쁜 것은 아니지만 주의해야 할 사항, 예를 들어 비교되는 파일 시스템이 동일하지 않을 수 있기 때문).
위 스크린샷의 출력을 복사하고 다음 정보로 보완한 예입니다.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
fio를 사용하여 crystaldiskmark 6의 동작을 복제하려는 스크립트를 만들었고 이전 테스트(예: 512kb 테스트)에 대한 지원도 추가했습니다. 이 답변은 처음 만든 후 오랜 시간이 지나서 업데이트되었습니다. 스크립트에는 많은 영역이 있습니다. 개선을 위해. 이전 버전 사용자에게는 변경 로그가 제공됩니다.
스크립트는 다음에 따라 달라집니다.페오그리고df. df가 없거나 설치하려는 경우에도 스크립트는 계속 작동합니다. 이 스크립트는 대시와 호환됩니다(대시를 사용하여 #!/bin/bash를 #!/bin/dash로 변경하려는 경우). 하지만 read 명령을 사용한 자동 완성은 대시에 지원되지 않습니다. , 테스트하려는 위치의 경로를 한 글자씩 입력하세요.)
전체 스크립트는 다음과 같습니다.
#!/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가 생성하는 것과 동일한 저장 파일의 모방된 버전이 출력됩니다.
다음은 이러한 파일을 동일한 드라이브의 3개 벤치마크(1개는 crystaldiskmark 사용, 2개는 스크립트 사용)와 비교한 이미지입니다.
스크립트를 실행하면 이를 구성하라는 메시지가 표시되며(옵션에는 대상 디렉터리, 루프, 크기, 쓰기 0 및 레거시 테스트가 포함됨) 아무 것도 입력하지 않으면 각 설정에 기본값이 있습니다. 특정 하드 드라이브를 테스트하려면 먼저 해당 하드 드라이브를 설치한 다음 테스트할 드라이브를 묻는 메시지가 나타나면 해당 하드 드라이브에 있는 디렉터리의 전체 경로를 입력해야 합니다. 스크립트가 실행되면 대상 디렉터리에 숨겨진 임시 파일이 생성되고 실행이 완료된 후 지워집니다. 프로세스가 실행되는 동안 Ctrl+C를 사용하여 프로세스를 취소하더라도 파일은 여전히 정리되어야 합니다.
테스트 결과는 순차 및 4KB의 두 단계로 표시되며 순차 읽기/쓰기 테스트가 먼저 완료되고 4KB 테스트가 실행되면 완료됩니다. 테스트가 완료되기 전에 프로세스를 취소하면 종료 시 부분 결과가 표시됩니다.
특히 테스트가 실행되는 동안 백그라운드에서 작업을 수행하는 경우 결과가 약간 다를 수 있으므로 테스트를 두 번 연속 실행하여 결과를 비교하는 것이 좋습니다.
이러한 테스트는 실행하는 데 오랜 시간이 걸릴 수 있습니다(새 버전의 스크립트에서는 이 기능이 크게 향상되었지만). 스크립트의 기본 설정은 현재 일반(SATA) SSD에 대한 것입니다.
다양한 드라이브 유형에 권장되는 크기 설정:
- (SATA) SSD: 1024(기본값)
- (모든) 하드 드라이브: 256
- (고급 NVME) SSD: 4096
- (중저가형 M.2/NVME) SSD: 2048
고급 NVME는 일반적으로 약 2GB/s의 읽기 속도를 갖습니다(예: Intel Optane 및 Samsung 960 EVO. 그러나 후자의 경우 4kb 속도가 느리기 때문에 2048을 권장합니다.), 중저 범위 읽기 속도 읽기 속도는 약 500-1800MB/s.
새 버전의 스크립트에서는 4KB 및 512KB 테스트가 더 이상 실제 전체 사용자 정의 크기를 사용하지 않기 때문에 훨씬 더 빨라집니다. (Crystaldiskmark는 또한 영원히 걸릴 4KB 테스트의 크기도 줄여줍니다.)
알려진 문제:
- 테스트 드라이브를 선택하는 데 사용되는 경로에는 공백이 포함될 수 없습니다.
- 나에게 묻는다면 ntfs-3g 벤치마크는 상당히 수상해 보입니다.
이제 알 수 있습니다. 즐기다!
답변3
노력하다K 디스크 마크, CrystalDiskmark와 매우 유사합니다.
애플리케이션은 C++ 및 Qt로 작성되었습니다.전혀KDE 의존성.
용법
먼저 폴더(및 선택적 기타 매개변수)를 선택한 후 을 클릭합니다 All
.
설치하다
우분투 기반 배포판
sudo add-apt-repository ppa:jonmagon/kdiskmark
sudo apt update
sudo apt install kdiskmark
아치 기반 배포
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
오픈수세 텀블위드
sudo zypper install kdiskmark
답변4
노력하다NetCore 스토리지 속도 테스트.
CrystalDiskMark와 완전히 동일하지는 않지만 지원하는 플랫폼에 장점이 있습니다.
디스크/저장 장치 읽기/쓰기 속도를 측정하기 위한 콘솔 애플리케이션(Linux, Windows 및 MacOS - .NET Core 3) 및 크로스 플랫폼 클래스 라이브러리(C#, .NET Standard 2).
이 프로젝트는 나열된 대로 Android도 지원합니다.GitHub 프로젝트 페이지.