SD 리눅스 속도 테스트
본문 바로가기
SD card

SD 리눅스 속도 테스트

by bsp-martin 2021. 12. 20.

 

SD 카드 속도에 대해서는 아래 포스팅에서 다뤘었다
https://bsp-martin.tistory.com/16

 

SD UHS-I

SD association 은 sd 표준은 만들고 표준이 명시된 스펙 기술문서를 배포한다 SD는 2.0버전까지는 HS(high speed)클래스로 동작한다. HS: 50Mhz 최대 25MB/s UHS-I 은 다음과같다. SDR12: 25 Mhz 최대 12 MB/s SD..

bsp-martin.tistory.com


그렇다면 현재 SD카드의 속도를 어떻게 측정할 것인가?

리눅스커널의 모둘중
CONFIG_MMC_TEST 를 이용하면 된다.
https://bsp-martin.tistory.com/11

 

Kconfig menuconfig 드라이버 추가해 보기

Kernel 드라이버를 잘 보려면 menuconfig 에 익숙해야한다. 예를들어 새로운 USB Ethernt 드라이버를 현재 Embedded 시스템에 추가하려면 어떻게 해야할까? 1. USB Ethernt 드라이버를 USB 드라이버를 찾으면 된

bsp-martin.tistory.com


커널의 menuconfig 수정으로
위 CONFIG_MMC_TEST를 모듈형식으로 설정해두면 된다.

모듈 빌드를하게되면 mmc_test.ko 파일이 나온다.
되로록 커널 로그레벨은 낮추어서 불필요한 로그가 나오지 않는 상태에서 Test 를 수행하길 바란다.

 

또한 SD 카드의 미디어는 재사용이 안됨으로 백업이 필요하다. (새SD를 이용하길 추천함)

 

아래는 mmc_test.sh 을 필자가 직접 제작하였다.

#!/bin/sh

TOP=`pwd`
MMC_DRIVER=mmc0 #$MMC_DRIVER
DIR_MMC=/sys/bus/mmc/drivers/mmcblk
DIR_MMC_TEST=/sys/bus/mmc/drivers/mmc_test
MMC_NUM=`ls /sys/kernel/debug/$MMC_DRIVER/ | grep  $MMC_DRIVER | cut -d':' -f2`
DIR_MMC_NN=/sys/kernel/debug/$MMC_DRIVER/$MMC_DRIVER\:${MMC_NUM}
HOSTNAME=`/bin/hostname`
MODULE=/mmc_test.ko
RET=
SUCCESS=0
FAIL=1
READ_TEST=39
# Write performance with blocking req 4k to 4MB
WRITE_PERF_NUM=37
# Read performance with blocking req 4k to 4MB
READ_PERF_NUM=39

TEST_NUM=$READ_PERF_NUM

existfile() {
  if [ -e $1 ]; then
    RET=$SUCCESS
  else
    echo "[CHK FILE] ERR: $1"
    RET=$FAIL
  fi
}

mmc_unbind() {
  existfile ${DIR_MMC}
  if [ $RET = $SUCCESS ]; then
    echo $MMC_DRIVER:${MMC_NUM} > ${DIR_MMC}/unbind
    existfile ${DIR_MMC}/unbind
    if [ $RET = $SUCCESS ]; then
      echo "[mmc_unbind] unbind $DIR_MMC"
      return
    else
      echo "[mmc_unbind] No such file ${DIR_MMC}/unbind"
      exit -1
    fi
  else
    echo "[mmc_unbind] No directory exist \"$DIR_MMC\""
    exit
  fi
}

mmc_test_unbind() {
  existfile ${DIR_MMC_TEST}
  if [ $RET = $SUCCESS ]; then
    echo $MMC_DRIVER:${MMC_NUM} > ${DIR_MMC_TEST}/unbind
    echo "[mmc_test_unbind] unbind $DIR_MMC_TEST"
    echo "[mmc_test_unbind] rmmod"
    rmmod mmc_test
  else
    echo "[mmc_test_unbind] No directory exist \"$DIR_MMC_TEST\""
    exit
  fi
}

mmc_test_work() {
  echo "[mmc_test_work] Started...(num_mmc: $MMC_NUM)"
  mmc_unbind
  sleep 1
  echo "[mmc_test_work] insmod"
  existfile ${MODULE}
  if [ $RET = $SUCCESS ]; then
    insmod ${MODULE}
  else
    echo "[mmc_test_work] No such file... ${MODULE}"
    exit -1
  fi
  sleep 1
  echo "[mmc_test_work] measurement start"
  existfile ${DIR_MMC_NN}/test
  if [ $RET = $SUCCESS ]; then
    echo $TEST_NUM > ${DIR_MMC_NN}/test
  else
    echo "[mmc_test_work] No such file ${DIR_MMC_NN}/test"
  fi
  sleep 3
  dmesg > ${2}
  sync

  echo "[mmc_test_work] $1 End..."
  sleep 1
  mmc_test_unbind
  echo "[mmc_test_work] mount mmc"
  echo $MMC_DRIVER:${MMC_NUM} > ${DIR_MMC}/bind
  sleep 1
}

### MAIN START
##{
  mmc_test_work mmc_test result.txt
  sync
##}
### MAIN END

 

사용방법

mmc_test.ko 파일이 / 에 존재함

Usage:
  ./mmc_test.sh

실행결과

[  261.009158] mmc0: Starting tests of card mmc0:59b4...
[  261.014896] mmc0: Test case 37. Write performance with blocking req 4k to 4MB...
[  353.956760] mmc0: Transfer of 32768 x 8 sectors (32768 x 4 KiB) took 92.933164836 seconds (1444 kB/s, 1410 KiB/s, 352.59 IOPS, sg_len 1)
[  400.809757] mmc0: Transfer of 16384 x 16 sectors (16384 x 8 KiB) took 46.839151523 seconds (2865 kB/s, 2798 KiB/s, 349.79 IOPS, sg_len 1)
[  427.756582] mmc0: Transfer of 8192 x 32 sectors (8192 x 16 KiB) took 26.932881263 seconds (4983 kB/s, 4866 KiB/s, 304.16 IOPS, sg_len 1)
[  442.149457] mmc0: Transfer of 4096 x 64 sectors (4096 x 32 KiB) took 14.379054673 seconds (9334 kB/s, 9115 KiB/s, 284.85 IOPS, sg_len 1)
[  452.039735] mmc0: Transfer of 2048 x 128 sectors (2048 x 64 KiB) took 9.876443172 seconds (13589 kB/s, 13271 KiB/s, 207.36 IOPS, sg_len 2)
[  456.955595] mmc0: Transfer of 1024 x 256 sectors (1024 x 128 KiB) took 4.901844127 seconds (27381 kB/s, 26739 KiB/s, 208.90 IOPS, sg_len 4)
[  461.576142] mmc0: Transfer of 512 x 512 sectors (512 x 256 KiB) took 4.606421127 seconds (29137 kB/s, 28454 KiB/s, 111.14 IOPS, sg_len 8)
[  464.394878] mmc0: Transfer of 256 x 1024 sectors (256 x 512 KiB) took 2.804807835 seconds (47852 kB/s, 46731 KiB/s, 91.27 IOPS, sg_len 16)
[  467.953230] mmc0: Transfer of 128 x 2048 sectors (128 x 1024 KiB) took 3.544317002 seconds (37868 kB/s, 36980 KiB/s, 36.11 IOPS, sg_len 32)
[  470.115874] mmc0: Transfer of 32 x 8192 sectors (32 x 4096 KiB) took 2.148521126 seconds (62469 kB/s, 61005 KiB/s, 14.89 IOPS, sg_len 128)

 

실행결과를 읽는 방법은 다음과 같다.

[  470.115874] mmc0: Transfer of 32 x 8192 sectors (32 x 4096 KiB) took 2.148521126 seconds (62469 kB/s, 61005 KiB/s, 14.89 IOPS, sg_len 128)
즉, 62469 kB/s 속도
반응형

'SD card' 카테고리의 다른 글

SD UHS-I  (0) 2021.12.20
SD카드 이야기  (0) 2021.12.17

댓글