microSD Card Benchmarks

In my experience, one of the highest-impact upgrades you can perform is to buy the fastest possible microSD card—especially for applications where you need to do a lot of random reads and writes.

There is an order-of-magnitude difference between most cheap cards and the slightly-more-expensive ones (even if both are rated as being in the same class)—especially in small-block random I/O performance. As an example, if you use a normal, cheap microSD card for your database server, normal database operations can literally be 100x slower than if you used a standard microSD card.

Because of this, I went and purchased over a dozen different cards and have been putting them through their paces. Here are the results of those efforts, in a nice tabular format:

Rasbperry Pi model 2 B

Card Make/Model hdparm buffered dd write 4K rand read 4K rand write
OWC Envoy SSD (USB) 64GB 34.13 MB/s 34.4 MB/s 7.06 MB/s 8.20 MB/s
SanDisk Ultra Fit (USB) 32GB 31.72 MB/s 14.5 MB/s 4.99 MB/s 1.07 MB/s
Samsung Pro+ 32GB 21.75 MB/s 18.7 MB/s 8.31 MB/s 1.75 MB/s
Samsung Pro 16GB 18.39 MB/s 18.2 MB/s 7.66 MB/s 1.01 MB/s
Samsung Evo+ 32GB 18.45 MB/s 14.0 MB/s 8.02 MB/s 3.00 MB/s
Samsung Evo 16GB 17.39 MB/s 10.4 MB/s 5.36 MB/s 1.05 MB/s
SanDisk Extreme Pro 8GB 18.43 MB/s 17.6 MB/s 7.52 MB/s 1.18 MB/s
SanDisk Extreme 16GB 18.51 MB/s 18.3 MB/s 8.10 MB/s 2.30 MB/s
SanDisk Ultra 16GB 17.73 MB/s 7.3 MB/s 5.34 MB/s 1.52 MB/s
NOOBS (1.4, C6) 8GB 17.62 MB/s 6.5 MB/s 5.63 MB/s 1.01 MB/s
Transcend Premium 300x 32GB 18.14 MB/s 10.3 MB/s 5.21 MB/s 0.84 MB/s
PNY Turbo (C10 90MB/s) 16GB 17.46 MB/s TODO 6.25 MB/s 0.62 MB/s
Toshiba (C10 40MB/s) 16GB 17.66 MB/s 11.2 MB/s 5.21 MB/s 0.21 MB/s
Sony (C10 70MB/s) 16GB 15.38 MB/s 8.9 MB/s 2.47 MB/s 0.24 MB/s
Kingston (C10) 16GB 17.78 MB/s 9.0 MB/s 5.75 MB/s 0.21 MB/s
Kingston (C10) 8GB 12.80 MB/s 7.2 MB/s 5.56 MB/s 0.17 MB/s
Nasya (C10) 16GB 16.05 MB/s 8.4 MB/s 2.28 MB/s 0.38 MB/s
No-name (C4) 4GB 13.37 MB/s Sad Painful Excruciating

Rasbperry Pi model 3 B

Card Make/Model hdparm buffered dd write 4K rand read 4K rand write
Samsung Pro+ 32GB 21.88 MB/s 20.2 MB/s 9.61 MB/s 2.16 MB/s
Samsung Pro 16GB 21.62 MB/s 22.1 MB/s 9.41 MB/s 1.66 MB/s
Samsung Evo+ 32GB 21.77 MB/s 15.8 MB/s 9.66 MB/s 3.43 MB/s
Samsung Evo Select 32GB 19.59 MB/s 5.7 MB/s 4.34 MB/s 0.71 MB/s
Samsung Evo 16GB 20.08 MB/s 10.4 MB/s 6.02 MB/s 1.02 MB/s
SanDisk Extreme Pro 8GB 21.02 MB/s 21.2 MB/s 9.07 MB/s 1.25 MB/s
SanDisk Extreme 16GB 22.08 MB/s 21.8 MB/s 9.44 MB/s 2.42 MB/s
SanDisk Ultra 16GB 20.79 MB/s 7.9 MB/s 5.98 MB/s 1.57 MB/s

Rasbperry Pi model 3 B results - overclocked microSD

You can double the microSD card reader's speed by adding an extra dtoverlay configuration inside /boot/config.txt (for instructions, see How to overclock the microSD card reader in the Raspberry Pi 3).

Card Make/Model hdparm buffered dd write 4K rand read 4K rand write
Samsung Pro+ 32GB 39.93 MB/s 31.0 MB/s 12.15 MB/s 1.84 MB/s
Samsung Pro 16GB1 31.59 MB/s 32.8 MB/s 11.20 MB/s 1.48 MB/s
Samsung Evo+ 32GB 37.68 MB/s 20.0 MB/s 12.20 MB/s 3.75 MB/s
Samsung Evo Select 32GB 24.56 MB/s 13.2 MB/s 4.69 MB/s 0.82 MB/s
Samsung Evo 16GB 32.47 MB/s 11.8 MB/s 6.44 MB/s 1.25 MB/s
SanDisk Extreme Pro 8GB 40.52 MB/s 35.9 MB/s 11.31 MB/s 1.28 MB/s
SanDisk Extreme 16GB 40.88 MB/s 39.1 MB/s 11.77 MB/s 2.36 MB/s
SanDisk Ultra 16GB 37.41 MB/s 8.5 MB/s 6.71 MB/s 1.61 MB/s

1 The Samsung Pro refused to overclock to 100 MHz; I could only overclock at 80 MHz reliably.

Benchmarks

All the benchmarks can be run quickly and easily by running a shell script in the Raspberry Pi Dramble repository:

curl https://raw.githubusercontent.com/geerlingguy/raspberry-pi-dramble/master/setup/benchmarks/microsd-benchmarks.sh | sudo bash

hdparm buffered

sudo hdparm -t /dev/mmcblk0

Rationale: hdparm gives basic raw throughput stats for buffered reads (by the disk/device itself). You could also test with -T instead of -t to test the OS filesystem cache performance (which allows the OS to dramatically speed up certain read operations), but for our purposes we just want to test the device itself.

Setup:

  1. Install hdparm: sudo apt-get install -y hdparm

dd write

sudo dd if=/dev/zero of=/home/pi/test bs=8k count=50k conv=fsync; sudo rm -f /home/pi/test

Rationale: dd simply copies data from one place (if) to another (of). If your filesystem caches are big enough, this is a pretty poor disk speed comparison test. Because of that, make sure that count is set to a parameter large enough to cause the OS to actually write data to the drive (e.g. 50k 8k blocks ~= 400 MB, which shouldn’t be able to be cached on a microSD card in a Pi!.

iozone 4K Random read/write

iozone -e -I -a -s 100M -r 4k -i 0 -i 1 -i 2 [-f /path/to/file]

Rationale: iozone is a very robust filesystem benchmark tool, which does a lot of useful tests that make sure you’re getting a broad overview of read and write performance for a variety of block sizes and situations. I like the lower block size random I/O tests especially, because many operations (like logging data, writing a row to an ACID-compliant database, or bulk loading of data) require as fast of small-block-size random I/O as possible.

Most cheap microSD cards, even if rated as being 100MB/sec+ class 10 cards, can’t sustain anywhere near that rate when writing random data—especially on the Raspberry Pi’s measly data bus. (Note that most of the above benchmarks, when run on a USB 3.0 card reader on my MacBook Air, show 5, 10, or 15 times greater performance in that environment).

Setup:

  1. Download the latest version: wget http://www.iozone.org/src/current/iozone3_434.tar
  2. Expand the tarfile: cat iozone3_434.tar | tar -x
  3. Go into the src folder: cd iozone3_434/src/current
  4. Build the executable: make linux-arm
  5. Symlink the executable into your local bin folder: sudo ln -s /home/pi/iozone_434/src/current/iozone /usr/local/bin/iozone