SD and USB FLASH Drive Performance
This page records some performance tests I did on SD cards and USB storage devices.
Background: Performance, longevity and cost
Evaluating the performance of solid state disks, we need to consider performance together with longevity and cost. If you are reading this page, you should be also familiar with our NAND Testing page which covers heavy-duty tests to understand the longevity of the wear-levelling technology in each card.
Update: we now also have SDCard Testing scripts based on flashbench.
Methodology
The test uses the OFW ".speed" command that first appeared in Q3A50 for XO-1.5 (slated for Q2E45 for XO-1).
.speed uses raw multiple-block reads and writes to access the target device in large chunks. It reads the first 32 MiB of the device into memory, calculates the read speed based on how long that took, then writes the data back out to the same place, calculating the write speed.
The chunk size is given by the "max-transfer" method of the target device. In some cases, max-transfer is smaller than the actual maximum transfer length that the device can support, because of filesystem performance tradeoffs. I did some preliminary testing of SD cards with chunk sizes larger than max-transfer and found that the measured performance increased only slightly.
The SD cards were tested in the external SD slot of an XO-1.5 revision "D4". The MicroSD cards were tested in the same slot using a (passive) MicroSD to SD mechanical adapter. I tested a SanDisk 4G MicroSD card in the internal slot and got the same result as for the same model card in the external slot.
To test the internal SDcard type at the OFW prompt
.speed /sd/disk@3
and to test the card in the external slot type
.speed /sd/disk@1
Results
Where one number is given, the results of several runs clustered tightly around that number. Where a range is given, the results varied more widely. "Large" numbers are rounded to the nearest integer.
Caution: these results do not survive well over time. Manufacturers do change controllers without updating the hardware and firmware IDs, and performance will vary. In the past, some manufacturers sold class 6 cards labelled as class 2, but have now introduced newer models which only meet the class 2 specs.
Device | Read Speed MB/sec |
Write Speed MB/sec |
fs-update os201.zd min:sec |
Notes |
---|---|---|---|---|
SD SanDisk ExtremeIII 2G | 20 | 18 | Mfg ID: 0x3 OEM ID: SD Name: SD02G Rev: 8.0 Date: 2007-9 SN: 0x2083a7c8 | |
SD SanDisk ExtremeIII 4G | 20 | 17 | Mfg ID: 0x3 OEM ID: SD Name: SD04G Rev: 8.0 Date: 2008-12 SN: 0x50a19f35 | |
SD SanDisk ExtremeIII 8G | 20 | 12-17 | Mfg ID: 0x3 OEM ID: SD Name: SD08G Rev: 8.0 Date: 2008-12 SN: 0x6051fd1c | |
SD Transcend 4G "150x" | 21 | 17 | 06:28 | Mfg ID: 0x1c OEM ID: SV Name: SDC Rev: 1.0 Date: 2007-1 SN: 0x1fb99 |
MicroSD SanDisk 4G "class 2" | 20 | 6-7 | 10:11 | Mfg ID: 0x3 OEM ID: SD Name: SU04G Rev: 8.0 Date: 2009-6 SN: 0x2e5501
Card sample given to wmb by wad during XO-1.5 early prototype build. |
MicroSD SanDisk 4G "Class 2" | 7.2 | 3.8 | 19:25 | Mfg ID: 0x1b OEM ID: SM Name: 00000 Rev: 1.0 Date: 2009-11
From an XO-1.5 built on May 15, 2010 -- tested on internal slot by Martin. |
MicroSD ADATA 2G | 11-15 | 6 | Mfg ID: 0x1b OEM ID: SM Name: 00000 Rev: 1.0 Date: 2010-5 SN: 0x2b060bfe | |
MicroSD ADATA 4G | 17 | 8 | 08:31 | Mfg ID: 0x1d OEM ID: AD Name: SD Rev: 1.0 Date: 2010-4 SN: 0x211012f2 |
Unmarked card from CL1C | 16.7 | 11.8 | about 11 | Mfg ID: 0x3 OEM ID: SD Name: SU04G Rev: 8.0 Rev:2010-1
Wad says they are Adata 4GB Class 6, but ID suggests SanDisk |
MicroSD Transcend 4G "class 2" | 20 | 7 | 10:00 | Mfg ID: 0x3 OEM ID: SD Name: SU04G Rev: 8.0 Date: 2009-8 SN: 0x70e2afd1 |
MicroSD Kingston 2G | 21 | 7 | Mfg ID: 0x2 OEM ID: TM Name: SD02G Rev: 3.2 Date: 2008-1 SN: 0xa5f880b6 | |
SD Panasonic 512M "PRO HIGH SPEED" (old) | 18 | 12 | Mfg ID: 0x1 OEM ID: PA Name: SK512 Rev: 6.4 Date: 2006-5 SN: 0xa8e53841 | |
SD SanDisk 32M (old) | 1.6 | 0.9 | Mfg ID: 0x0 OEM ID: SD Name: SD032 Rev: 3.1 Date: 2003-3 SN: 0x48d46772 | |
MMC Kingston 256M (old) | 3 | 3 | ||
USB Datatraveler 1G | 6.4 | 2.4 | ||
USB SanDisk Cruzer 4G | 6.4 | 0.8-1.4 | ||
USB Verbatim 1G | 6.4 | 1.2 | ||
USB Belkin 1G | 3.6 | 3.4 | ||
USB Seagate 4G Hard Disk Puck | 5.1-6.2 | 6.2 | ||
USB Kingston MicroSD Adapter w/Kingston 2G MicroSD | 6.4 | 4.5 | ||
USB SanDisk SD Adapter w/Transcend 4G SD | 6.4 | 6.2 | ||
USB SanDisk SD Adapter w/Transcend 4G SD | 6.4 | 6.2 | ||
USB SanDisk SD Adapter w/Transcend 4G SD | 6.4 | 6.2 | ||
USB SanDisk SD Adapter w/ExtremeIII 2G SD | 6.4 | 1.9 | ||
USB SanDisk SD Adapter w/ExtremeIII 4G SD | 6.4 | 6.3 | ||
USB SanDisk SD Adapter w/Transcend 4G MicroSD | 6.4 | 1.5-4.6 | ||
USB SanDisk SD Adapter w/ADATA 2G MicroSD | 3.8 | 4.1 | ||
USB SanDisk SD Adapter w/ADATA 4G MicroSD | 6.4 | 4.5 |
Notes
The USB speed is limited to 6.4 MB/sec by a couple of factors that I know of. First, the max-transfer value for the OFW USB storage driver is relatively small - on the order of 16KiB, compared to the SD driver's max-transfer of 64KiB. Second, the OFW USB mass storage driver issues three separate USB transactions for each read or write operation (command, data, status). If the driver were more clever, it could combine those three in one descriptor chain and save some software overhead.
For the cards that are labeled "class 2", there is some suspicion that they are really mis-labeled class 6 cards. We had a mis-labeled batch around the time that I got those cards.
Observations
The regular-size SD cards seem to consistently outperform the MicroSD cards on writes by a factor of about 2.5!
The fs-update time tracks the measured write speed. There is a lower limit to the fs-update time based on the read speed of the USB stick that contains the ".zd" source file.
Future Work
Would the results change if a different set of blocks - not beginning at 0 - were tested?
Would the age (number of previous reads/writes) of the card affect the results? (I have heard rumors that some low-speed-class cards start out faster than their rated speed, but over time degrade to their rated speed.)