Identifying counterfeit microSD cards on a Beaglebone Black
Dr. Rolf Jansen
rj at obsigna.com
Sun Mar 19 00:30:50 UTC 2017
Am 18.03.2017 um 16:07 schrieb Ian Lepore <ian at freebsd.org>:
> On Sat, 2017-03-18 at 15:03 -0300, Dr. Rolf Jansen wrote:
>> Am 18.03.2017 um 12:30 schrieb Warner Losh <imp at bsdimp.com>:
>>>
>>> On Sat, Mar 18, 2017 at 8:44 AM, Dr. Rolf Jansen <rj at obsigna.com>
>>> wrote:
>>>>
>>>> I bought a 16 GB microSDHC SanDisk chip rated at 4 MB/s write
>>>> speed for use with my Beaglebone Black.
>>>>
>>>> The internal flash offers practical write speeds in the range of
>>>> 2 to 3 MB/s when copying data to it from a NFSv4 volume depending
>>>> on the size of the files being copied. Executing the same copy
>>>> operation with said microSDHC card as the target I see only 0.1
>>>> to 0.2 MB/s (less than 1/10).
>>>>
>>>> I suspect now that I got a counterfeited card. Before I dump it,
>>>> I would like to run a definitive non-destructive test, preferably
>>>> on the Beaglebone Black, and I would like to ask you for
>>>> suggestions.
>>>>
>>>> Also, it would be nice to see some speed values as a reference
>>>> for microSDHC card write speeds on:
>>>>
>>>> FreeBSD 12.0-CURRENT (BEAGLEBONE) #0 r315413
>>>>
>>>> Many thanks in advance for any help.
>>> Copy a huge file from /dev/zero. Smaller files in the filesystem
>>> generate a lot of overhead and 'wait points' that slow down overall
>>> performance.
>>>
>>> Or better yet, dd to the raw device. /dev/random should generate
>>> data
>>> faster than the card can handle. Depends on what you mean by
>>> 'non-destructive'
>>>
>>> And all NAND sucks. It's a pig with lipstick on it. So you won't
>>> get
>>> even performance if the FTL in the SD card sucks. Garbage
>>> collection,
>>> internal house keeping, etc all can steal performance from the user
>>> application. These cards are generally designed to take a burst of
>>> writes when the camera or video is taken, then have it read back
>>> later. A mixed workload was never optimized for on most of these
>>> cards, so it can also significantly degrade performance even at low
>>> percentage mixtures.
>>>
>>> So all those things could be going on w/o it being a counterfeit.
>>> :(.
>>> Of course, it could have all those things going on and also be a
>>> counterfeit. Hard to say for sure unless the performance is wildly
>>> different. But 4MB/s write performance is pretty pathetic for a
>>> card
>>> of that size, so it's on the low end, which suffers most from
>>> uneven
>>> performance and "down hill with the wind" spec numbers.
>> Warner, thank you very much for taking your time responding.
>>
>> It is a Class 4 card, i.e. guaranteed minimum write speed should be 4
>> MB/s, and I know the difference between advertised and practical
>> speed, I would have expected at lest 50 % of the advertised speed,
>> i.e. something in the range that can be achieved with the internal
>> flash of the BBB. I would even be happy if it would come close to 1
>> MB/s. But 0.1 MB/s that is a quit huge difference -- 40 times less
>> than the advertised speed.
>>
>> You said, that 4 MB/s is "pretty pathetic". Therefore let me ask a
>> different question. What is the best write speed that can be achieved
>> with what model of a microSD card on a Beaglebone Black running
>> FreeBSD 12-Current?
>>
>> Many thanks and best regards
>>
>> Rolf
>
> First we've got to keep in mind that BBB has a wimpy processor, and the
> sdhci driver for beaglebone uses PIO, not DMA. If we try a naive test
> of writing 100mb of random data to the sdcard...
>
> root at bb:~ # dd if=/dev/random of=/dev/mmcsd0s2 bs=1m count=100
> 100+0 records in
> 100+0 records out
> 104857600 bytes transferred in 14.559020 secs (7202243 bytes/sec)
>
> It comes in at 7mb/sec, but were we really measuring card performance?
>
> root at bb:~ # dd if=/dev/random of=/dev/null bs=1m count=100
> 100+0 records in
> 100+0 records out
> 104857600 bytes transferred in 6.888693 secs (15221698 bytes/sec)
>
> So ~15mb/sec just generating and writing random numbers to /dev/null,
> that's not very good, in theory an sdcard can write faster than that.
>
> So let's take the random generation cpu cycles out of the picture by
> caching some random data...
>
> root at bb:~ # dd if=/dev/random of=/tmp/rand bs=1m count=100
> 100+0 records in
> 100+0 records out
> 104857600 bytes transferred in 8.566184 secs (12240876 bytes/sec)
> root at bb:~ # dd if=/tmp/rand of=/dev/null bs=1m
> 100+0 records in
> 100+0 records out
> 104857600 bytes transferred in 0.625300 secs (167691590 bytes/sec)
>
> That's more like it, now we're not measuring processor performance when
> we use dd. Now let's see what a raw write to that same sdcard does
> using the cached random data...
>
> root at bb:~ # dd if=/tmp/rand of=/dev/mmcsd0s2 bs=1m
> 100+0 records in
> 100+0 records out
> 104857600 bytes transferred in 7.777464 secs (13482236 bytes/sec)
>
> So that's about twice as fast as our first naive attempt to test
> writing 100mb of random data, and probably represents something pretty
> close to the actual BBB raw write speed under best-case conditions for
> an sdcard: large sequential writes.
>
> Now using that command to get actual numbers for some cards I have
> laying around:
>
> Apacer 8gb class 10: 14226229 bytes/sec (industrial temp range)
> Kingston 8gb class 4: 7008571 bytes/sec
> Kingston 8gb class 10: 9715391 bytes/sec
> Lexar 8gb class 6: 8821627 bytes/sec
> Sandisk 2gb class n/a: 6163704 bytes/sec (predates speed classes)
> Samsung 32gb class 6: 13482236 bytes/sec
>
> So the cards that perform best are the two I have which cost more than
> twice as much as any of the others. Not surprising, I suppose.
>
> Remember all of these 'dd' tests are for an sdcard's best-case
> condition. Real-world UFS accesses are anything but best-case. The
> thing an sdcard is worst at is small writes (anything from single-
> sector to 16k is very small compared to the typical 4mb erase-block
> size on a modern sdcard). Writing ufs metadata is lots and lots of
> small writes. You can reduce the writes quite a bit by using
> softupdates without journaling.
Ian, many thanks for your research. The maximum write speed that I could achieve was 1 MByte/s with dd'ing cached random data, and the test results varied quite a bit when repeating the same dd command, the worst speed was 500 kByte/s.
I will buy a new card, and hopefully I will come with that one more close to the range of rates that you reported for your various cards.
Best regards
Rolf
More information about the freebsd-arm
mailing list