Android 폰, 또는 DSLR 등에서 쓰기 위해 구입했던 SD Card에 대하여 진행한, dd를 사용한 간이 읽기/쓰기 속도 시험. 워낙 메뉴얼 보기를 돌같이 하다 보니 처음에는 (오히려 복잡한) 무식한 방법을 썼었고, 오늘 새 microSD를 추가하는 김에 좀 다듬었다. 다듬는 김에 문서도 좀 업데이트.

결론은,

  • 빨라졌다고 해도, 별로 빠르지 않다.
  • SD Card Reader는 USB 3.0을 살 필요가 없다 이제는 살만 하다.

결과

ProductREADWRITETested at
SanDisk Extreme 256GB microSDXC I V30 A2 U3 C1086.2667.712025-12-19
KODAK 64GB microSDXC I V30 A1 U3 C1078.4421.922025-11-10
SanDisk Extreme PRO 256GB SDXC I V30 U3 C1083.5284.562018-12-12
SanDisk Ultra 200GB microSDXC I A1 U1 C1082.6231.302018-12-11
SanDisk Ultra Plus 128GB microSDXC I V10 A1 U175.9032.97
SanDisk Extreme 64GB microSDXC I U3 C1054.0034.73
SanDisk 64GB SDXC I U1 (?)67.5435.62
Samsung 64GB SDXC I U1 C10 (?)44.4613.21
Samsung 32GB SDHC I U1 C10 (?)51.4734.13
SanDisk 32GB SDHC Class 4 (D1)20.576.20

기록을 위한 문서니까 결과를 맨 앞에 넣었다. 시험 조건을 최대속도를 낼 수 있는 조건으로 하지 않은 탓도 있고, 또한 내 Laptop의 한계일 수도 있지만 생각보다 속도가 잘 나오지 않는다. 제품 구매 시 SPEC은 짱짱한데…

SPEC

ProductREADWRITE
SanDisk Extreme 256GB microSDXC I V30 A2 U3 C10190 MB/s130 MB/s
SanDisk Extreme PRO 256GB microSDXC I V30 A2 U3*200 MB/s140 MB/s
KODAK 64GB microSDXC I V30 A1 U3 C10100 MB/s70 MB/s
Samsung EVO Plus 256GB microSDXC I V30 A2 U3*100 MB/s90 MB/s
SanDisk Extreme PRO 256GB SDXC I V30 U3 C10200 MB/s140 MB/s
SanDisk Ultra 200GB microSDXC I A1 U1 C10120 MB/s- MB/s
SanDisk Ultra Plus 128GB microSDXC I V10 A1 U1100 MB/s- MB/s
SanDisk Extreme 64GB microSDXC I U390 MB/s40 MB/s
SanDisk Extreme 64GB microSDXC I U145 MB/s- MB/s

SPEC만 보면 아우~ 두 배는 빨라야 하는데…

구매이력

ProductDateFromPrice
SanDisk Extreme 256GB microSDXC I V30 A2 U3 C102025-12-18CPNG48,850
SanDisk Extreme PRO 256GB microSDXC I V30 A2 U3*2025-01-11CPNG34,090
KODAK 64GB microSDXC I V30 A1 U3 C102023-10-04Ali2,705
Samsung EVO Plus 256GB microSDXC I V30 A2 U3*2023-01-17CPNG29,510
SanDisk Extreme PRO 256GB SDXC I V30 U3 C102018-07-1011st129,590
SanDisk Ultra 200GB microSDXC I A1 U1 C102018-07-00
SanDisk Ultra Plus 128GB microSDXC I V10 A1 U1
SanDisk Extreme 64GB microSDXC I U3
SanDisk Extreme 64GB microSDXC I U1 (?)2013-12-2611st90,830
Samsung PRO 64GB microSDXC C10 (?)2013-06-2411st61,160
Samsung Plus 32GB SDHC I C10 (?)2013-06-1411st26,150
Sandisk Ultra 64G microSDXC C10 30M (-)2013-03-2811st57,070

일부는 구매이력과 시험이력이 불분명하다. :-(

상세

READ SPEED1st2nd3rd4th5thAVG
SanDisk Extreme 256GB microSDXC I V30 A284.986.686.087.086.886.26
KODAK 64GB microSDXC I V30 A1 U3 C1078.078.978.378.378.778.44
SanDisk Extreme PRO 256GB SDXC I V30 U382.683.983.583.484.283.52
SanDisk Ultra 200GB microSDXC I A1 U182.681.383.382.582.982.62
SanDisk Ultra Plus 128GB microSDXC I V1076.076.176.075.575.975.90
SanDisk Extreme 64GB microSDXC I U354.054.054.054.054.054.00
SanDisk 64GB SDXC I U1 (?)67.467.667.667.667.567.54
Samsung 64GB SDXC I U1 C10 (?)44.944.844.344.344.144.46
Samsung 32GB SDHC I U1 C10 (?)51.351.651.5--51.47
SanDisk 32GB SDHC Class 4 (D1)20.620.620.5--20.57
WRITE SPEED1st2nd3rd4th5thAVG
SanDisk Extreme 256GB microSDXC I V30 A265.768.167.068.769.067.71
KODAK 64GB microSDXC I V30 A1 U3 C1022.521.820.922.422.021.92
SanDisk Extreme PRO 256GB SDXC I V30 U389.690.463.089.690.284.56
SanDisk Ultra 200GB microSDXC I A1 U128.132.731.931.832.031.30
SanDisk Ultra Plus 128GB microSDXC I V1034.430.031.136.133.332.97
SanDisk Extreme 64GB microSDXC I U334.435.030.835.937.634.73
SanDisk 64GB SDXC I U1 (?)35.636.231.639.035.735.62
Samsung 64GB SDXC I U1 C10 (?)(5.7)8.310.916.816.913.21
Samsung 32GB SDHC I U1 C10 (?)42.945.423.119.340.034.13
SanDisk 32GB SDHC Class 4 (D1)7.05.85.66.16.56.20

시험방법

읽기 및 쓰기 성능시험에 사용한 명령어는 다음과 같다.

읽기시험

$ for i in 1 2 3 4 5; do LANG=C sudo dd if=/dev/mmcblk0 of=/dev/null bs=4M count=256 iflag=direct 2>&1 |tail -1; done
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.7332 s, 84.3 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.4112 s, 86.5 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.4398 s, 86.3 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.4831 s, 86.0 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.592 s, 85.3 MB/s
$ 
$ echo "(84.3+86.5+86.3+86.0+85.3)/5" |bc -l
85.68000000000000000000
$ 

위의 결과는, 이미 오래 전에 시험을 했던 SanDisk Ultra 200GB 모델을 용도를 바꾸면서 한 번 더 시험한 것이다. 이전 방식과 새로운 방식으로 모두 해봤는데, 결과는 두 방식 모두, 그리고 이전 결과와도 거의 비슷하다.

아래는 이전에 사용하던 방식이다. 두 가지 차이가 있는데, 작은 것부터 말하면 이제는 bs=4M count=256를 쓰는데 반해 과거에는 bs=4k count=262144를 썼었다. 좀 더 짜잘한 I/O를 만들어서 빡세게 시험하려던 거였는데, 요즘 세상에 4KB가 표준이 될 수 있을까 싶어서 변경했다. 다른 하나는, 이게 더 중요한 건데, 과거에는 echo 3 |sudo tee /proc/sys/vm/drop_caches를 사용해서 시스템 캐시를 날려가며 시험했는데, 좀 무식하지 않을 수 없다. 그래서 이제는 동일한 효과를 iflag=direct 옵션으로 주고 있다. 이 flag는 입력에 한하여 Direct I/O를 사용하도록 강제하는 것인데, 이를 통해 OS Cache의 영향을 제거한 순수한 I/O 성능을 확인할 수 있다. (direct 외에도 sync 등의 옵션을 고려할 수도)

$ for i in 1 2 3 4 5; do sync; echo 3 |sudo tee /proc/sys/vm/drop_caches >/dev/null; LANG=C sudo dd of=/dev/null if=/dev/mmcblk0 bs=4k count=262144 2>&1 |tail -1; done
1073741824 bytes (1.1 GB) copied, 14.1356 s, 76.0 MB/s
1073741824 bytes (1.1 GB) copied, 14.1099 s, 76.1 MB/s
1073741824 bytes (1.1 GB) copied, 14.1217 s, 76.0 MB/s
1073741824 bytes (1.1 GB) copied, 14.2261 s, 75.5 MB/s
1073741824 bytes (1.1 GB) copied, 14.1416 s, 75.9 MB/s
$ 

이 결과는 “SanDisk Ultra Plus 128GB microSDXC I V10 A1 U1” 모델에 대해 예전에 시험했던 결과다. (이번에 용도변경을 위해 시험해보니 제대로 동작하지 않는다. 좀 더 확인해보고 폐기처분해야 할 듯. 비싸게 샀는데… ㅠ.ㅠ)

쓰기시험

$ for i in 1 2 3 4 5; do rm -f test; LANG=C sudo dd if=/dev/zero of=test bs=4M count=256 oflag=direct 2>&1 |tail -1; done
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.0828 s, 25.5 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 39.9583 s, 26.9 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 41.8014 s, 25.7 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 40.0038 s, 26.8 MB/s
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.1812 s, 25.5 MB/s
$ 
$ $ echo "(25.5+26.9+25.7+26.8+25.5)/5" |bc -l
26.08000000000000000000
$ 

읽기 시험에 비해, 쓰기 시험은 조금 까다로운 면에 있다. 기본적으로 디스크에 변형이 가해진다는 점이 가장 커서, 이미 파일시스템이 있고 사용중인 디스크에 대해서도 시험할 수 있도록 of를 파일로 지정해서 사용하고 있다.

사용된 옵션을 보면, 역시 bs=4Mcount=256을 사용해서 1GB를 쓰는 시험을 하고 있고, 이번에는 iflag가 아닌 oflag=direct 옵션을 주어 OS Cache의 도움을 제거했다. 만약 이 옵션을 제거한다면 결과가 다음과 유사하게 나온다.

$ sudo dd if=/dev/zero of=test bs=4k count=262144 2>&1 |tail -1; time sync
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.68704 s, 400 MB/s

real	0m39.834s
user	0m0.000s
sys	0m0.009s
$ 

위의 결과는 동일한 Disk에 대해 수행한 결과인데, 속도가 400 MB/s으로 찍혀있다. 이 말이 안되는 속도는, Application이 write를 했을 때 OS가 그것을 (실제 디스크 기록 없이) 껴안아주고 뒷일을 맡아주기 때문인데, 이렇게 되면 실제로 Disk에 물리적인 sync가 일어날 때 소요되는 시간을 알아야 한다. 그래서 dd 명령에 이어 sync 명령을 내림으로써 sync에 사용된 시간을 확인하고, 그 값을 실제 I/O 시간으로 간주하여 1024 MB / real second의 계산으로 속도를 구했었다.

$ echo "1024 / 39.834" |bc -l
25.70668273334337500627
$ echo "1024 / (39.834 + 2.687)" |bc -l
24.08221819806683756261
$ 

계산을 하면 대략 위와 같은 값이 나오는데, oflag=direct를 준 변형된 명령의 결과와 비슷하게 나오지만 상황에 따라 오류가 낄 수 있다. (가령, 동작 중인 다른 application에서 I/O가 있었다든지…)

아무튼, 늘 좀 어설픈 시험이라 거시기했는데 이제 좀 더 깔끔해진 느낌? ㅎ

comments powered by Disqus