Linux의 벤치 마크 SSD : Crystaldiskmark와 Windows에서 동일한 작업을 측정하는 방법


26

ssd (암호화 된 파일 시스템으로)를 벤치 마크하고 창에서 crystaldiskmark로 수행 한 벤치 마크와 비교하고 싶습니다.

Windows의 CrystalDiskMark

그러면 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 (Queue Depth = 32)에서 속도 테스트를 읽고 씁니다. 리눅스에서 측정을 재현하는 방법을 모르십니까? 어떻게해야합니까?

sudo hdparm -Tt /dev/sda를 들어 encfs마운트 와 같은 벤치 마크를 원하기 때문에 독서 속도를 테스트 하는 것은 나에게 의미가없는 것 같습니다 .

편집하다

@ 알코, @iain

아마도이 질문에 대한 동기 부여에 대해 뭔가 써야 할 것입니다 .ssd를 벤치 마크하고 일부 암호화 솔루션을 비교하려고합니다. 그러나 그것은 또 다른 질문입니다 ( 시스템에서 다른 암호화 솔루션을 벤치마킹하는 가장 좋은 방법 ). 웹에서 ssd 및 벤치마킹에 대해 서핑하는 동안 사용자가 CrystelDiskMark 결과를 포럼에 게시하는 것을 종종 보았습니다. 이것이 이것이 질문에 대한 유일한 동기입니다. 나는 리눅스에서 똑같이하고 싶다. 내 특정 벤치마킹에 대해서는 다른 질문을 참조하십시오.


두 시스템에서 모두 작동하는 벤치마킹 도구를 사용하지 않는 이유는 무엇입니까?
Alko

이 발견이 매우 유용 할 것 같습니다 세 별도의 드라이브에 테스트 내 짧은에 실제 crystaldiskmark ... 매우 유사 숫자했다 github.com/buty4649/fio-cdm
ljwobker을

2019 :이 Q는 새로 시작해야 할 중요한 주제입니다.하지만 여기서 초점을 약간 잃었습니다. "수락 및 보관".
rastafile

답변:


22

fio 는 이러한 작업 부하를 생성하는 데 아무런 문제가 없을 것이라고 말하고 싶습니다 . 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 에서 확인할 수 있습니다 .


3
우분투 16.04에서 fio와 Windows 7에서 CrystalDiskMark를 사용해 보았습니다. 일부 숫자는 일치하지만 다른 숫자는 일치하지 않습니다. 순차적 r / w는 2의 요인에 의해 해제되었습니다. 즉, Linux 값은 CDM v3.0.4에서보고 된 값의 50 %입니다 (참고 : 현재 버전은 6.0.0이지만 이전 버전은 여전히 ​​다운로드 할 수 있음). 시차를 피하기 위해 1m 대신 bs = 4m을 설정했습니다. 그것은 숫자를 더 가깝게 만들었다. 8m와 32m을 시도하면 더 가까워졌습니다. 궁극적으로 Anon이 그의 대답이 완전하지 않고 @Alko와 마찬가지로 두 OS 모두에서 동일한 도구가 필요하다고 말했습니다. 또한 최신 CDM 6은 OP와 다른 테스트를 사용합니다. 좋은 정보 Anon
Vahid Pazirandeh

2
@VahidPazirandeh 흥미롭고, github.com/buty4649/fio-cdm/blob/master/fio-cdm 은 1m 설정이 동일합니다. 아마도 cdm의 문서가 충분하지 않을 수 있습니다.
inf3rno

@ vahid-pazirandeh 천만에요. NB : 두 OS에서 동일한 도구 fio 를 사용하려면 Windows 용 버전 도 있습니다.
Anon

8

crystaldiskmark의 동작을 fio로 복제하는 스크립트를 만들었습니다. 이 스크립트는 512K 및 4KQ8T8 테스트를 포함하여 crystaldiskmark 6까지 다양한 버전의 crystaldiskmark에서 사용 가능한 모든 테스트를 수행합니다.

스크립트는 fiodf 에 따라 다릅니다 . 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 모델은 고급형이지만 그보다 훨씬 더 나은 결과를 얻을 수 있습니다.

그리고 거기 있습니다. 즐겨!


Windows에서 스크립트가 fio와 어떻게 동작하는지 확인 했습니까?
Anon

1
(Cestarian 이외의 독자에 대한 참고 사항 : fio를 사용하는 새로운 도구를 만드는 경우 가능한 사람이 읽을 수있는 fio 출력을 긁지 마십시오 --output-format=json. JSON을 사용 하고 구문 분석하십시오. Fio의 사람이 읽을 수있는 출력은 기계에 적합하지 않습니다. fio의 인간 출력 스크랩으로 인해 바람직하지 않은 결과가 발생하는 경우의 YouTube 비디오를 참조하십시오. )
Anon

고마워, 나는 그것을 명심할 것이다, 슬프게도 더 이상 창문 설치가 없기 때문에 그것을 테스트 할 수 없다. 그러나, 나는 내 SSD에 대한 크리스탈 디스크 마크 결과를 찾기로 결정했고 내 기억이 잘못 된 것처럼 보인다. 결과는 결국 내가 겪고있는 것에 추가됩니다. 결과가 느리다고 생각하게 만드는 것은 내 잘못에 대한 오해였습니다 : / 나는 그것을 고칠 것입니다. 또한 향후 답변을 위해 json 출력을 사용하고 GUI 버전을 사용하도록 곧이 답변을 업데이트 할 것입니다. (Gitdialog에 대한 작업이 시작되었지만 gtkdialog가 제대로 문서화되지 않았고 zenity가 제한되어 있으므로 어려움을
겪고

1
@Cestarian, 훌륭한 스크립트이지만 CentOS7에서 "즉시"작동하지 않습니다. 나는했다 수정 그것을 조금.
Igor

1
@ Igor 재미있는, 그래, 나는 manjaro에 그것을 만들었고 나는 bash에 대한 전문가가별로 없다.
Cestarian

5

iozone및 을 사용할 수 있습니다 bonnie. 그들은 크리스탈 디스크 마크가 할 수있는 일 등을 할 수 있습니다.

iozone개인용 컴퓨터에서 엔터프라이즈 스토리지 시스템에 이르는 장치를 벤치마킹하고 스트레스 테스트하는 동안 개인적 으로 많은 것을 사용 했습니다. 모든 작업을 수행하는 자동 모드가 있지만 필요에 따라 조정할 수 있습니다.


5
이를 이용하여 결정 측정을 상세하게 재현하는 방법은 무엇입니까?
학생

2
최선을 다하여 방법을 쓰려고하지만 Crystal Disk Mark가 수행하는 테스트 목록이 필요합니다. 스크린 샷에서 볼 수있는 것 외에 소프트웨어가 실행하는 다른 테스트가 있습니까?
bayindirh

1
스크린 샷에있는 것만
trr

1

나는 당신이하고있는 일을 자세히 고려할 때 다양한 심층 테스트가 실제로 의미가 있는지 확신하지 못합니다.

블록 크기 및 대기열 깊이와 같은 설정은 SSD가 장착 된 ATA 인터페이스의 저수준 입력 / 출력 매개 변수를 제어하기위한 매개 변수입니다.

간단한 파티션 파일 시스템의 대용량 파일처럼 드라이브에 대해 기본 테스트를 실행할 때 모든 것이 좋습니다.

encfs 벤치마킹에 대해 이야기하기 시작하면 이러한 매개 변수는 더 이상 파일 시스템에 더 이상 적용되지 않으며 파일 시스템은 드라이브에 백업되는 파일 시스템으로 돌아가는 다른 인터페이스입니다.

여기에는 여러 가지 DD 명령을 타이밍으로 테스트 할 수있는 원시 디스크 IO 속도 (두 가지 요소가있는 경우 예제를 제공 할 수 있음)라는 두 가지 요소가 있기 때문에 정확히 측정하려는 것을 이해하는 것이 도움이 될 것이라고 생각합니다. 원하는 경우 / without / encfs를 사용하지 않으면 프로세스가 암호화에 의해 CPU가 제한되고 암호화 알고리즘의 상대적 처리량을 테스트하려고합니다. 이 경우 큐 깊이 등의 매개 변수는 특별히 관련이 없습니다.

두 가지 측면에서 시간이 지정된 DD 명령은 원하는 기본 처리량 통계를 제공하지만 측정하려는 대상과 관련 매개 변수를 고려해야합니다.

이 링크는 '버퍼 / 캐시 제거'등에 대한 필수 범위를 포함 하여 시간이 지정된 DD 명령사용한 디스크 속도 테스트에 대한 유용한 안내서를 제공 합니다. 아마도 이것은 필요한 정보를 제공 할 것입니다. 디스크 성능 또는 암호화 성능에 더 관심이있는 대상을 결정하면 둘 중 하나가 병목 현상이되고 병목 현상이 발생하지 않는 튜닝은 아무런 이점이 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.