Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Mar 2017 18:45:10 -0300
From:      "Dr. Rolf Jansen" <rj@obsigna.com>
To:        freebsd-arm@freebsd.org
Subject:   Re: Identifying counterfeit microSD cards on a Beaglebone Black
Message-ID:  <2F7D5F42-E50A-4761-9EEC-DC873BD7D0AB@obsigna.com>
In-Reply-To: <16B03E70-00E6-4C17-9A9A-8601F4C07364@obsigna.com>
References:  <D08E6528-56E6-4229-8722-D87116B8064D@obsigna.com> <CANCZdfo97-iFg4zLxbyQhv9rPrd8eU5rN-mzDL5wz3xj6XxrsQ@mail.gmail.com> <A633D336-2581-4C51-A3C9-7AFD0ABB9E9F@obsigna.com> <1489864043.40576.219.camel@freebsd.org> <16B03E70-00E6-4C17-9A9A-8601F4C07364@obsigna.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Am 18.03.2017 um 21:30 schrieb Dr. Rolf Jansen <rj@obsigna.com>:
> Am 18.03.2017 um 16:07 schrieb Ian Lepore <ian@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@bsdimp.com>:
>>>>=20
>>>> On Sat, Mar 18, 2017 at 8:44 AM, Dr. Rolf Jansen <rj@obsigna.com>
>>>> wrote:
>>>>>=20
>>>>> I bought a 16 GB microSDHC SanDisk chip rated at 4 MB/s write
>>>>> speed for use with my Beaglebone Black.
>>>>>=20
>>>>> 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).
>>>>>=20
>>>>> 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.
>>>>>=20
>>>>> Also, it would be nice to see some speed values as a reference
>>>>> for microSDHC card write speeds on:
>>>>>=20
>>>>>   FreeBSD 12.0-CURRENT (BEAGLEBONE) #0 r315413
>>>>>=20
>>>>> 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.
>>>>=20
>>>> 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'
>>>>=20
>>>> 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.
>>>>=20
>>>> 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.
>>>=20
>>> 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.
>>>=20
>>> 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?
>>>=20
>>> Many thanks and best regards
>>>=20
>>> Rolf
>>=20
>> 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...
>>=20
>> root@bb:~ # dd if=3D/dev/random of=3D/dev/mmcsd0s2 bs=3D1m count=3D100
>> 100+0 records in
>> 100+0 records out
>> 104857600 bytes transferred in 14.559020 secs (7202243 bytes/sec)
>>=20
>> It comes in at 7mb/sec, but were we really measuring card =
performance?
>>=20
>> root@bb:~ # dd if=3D/dev/random of=3D/dev/null bs=3D1m count=3D100
>> 100+0 records in
>> 100+0 records out
>> 104857600 bytes transferred in 6.888693 secs (15221698 bytes/sec)
>>=20
>> 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.
>>=20
>> So let's take the random generation cpu cycles out of the picture by
>> caching some random data...
>>=20
>> root@bb:~ # dd if=3D/dev/random of=3D/tmp/rand bs=3D1m count=3D100
>> 100+0 records in
>> 100+0 records out
>> 104857600 bytes transferred in 8.566184 secs (12240876 bytes/sec)
>> root@bb:~ # dd if=3D/tmp/rand of=3D/dev/null bs=3D1m
>> 100+0 records in
>> 100+0 records out
>> 104857600 bytes transferred in 0.625300 secs (167691590 bytes/sec)
>>=20
>> 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...
>>=20
>> root@bb:~ # dd if=3D/tmp/rand of=3D/dev/mmcsd0s2 bs=3D1m
>> 100+0 records in
>> 100+0 records out
>> 104857600 bytes transferred in 7.777464 secs (13482236 bytes/sec)
>>=20
>> 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.
>>=20
>> Now using that command to get actual numbers for some cards I have
>> laying around:
>>=20
>> 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
>>=20
>> 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.
>>=20
>> 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.
>=20
> 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.
>=20
> 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.

I found another (old) microSD card SanDisk 16 GB Class 10. After =
partitioning but before formatting with newfs, I tested the sequential =
writing speed be dd'ing directly to the device. I set apart only 50 MB =
in my tmpfs, and therefore I ran the tests with 40 MB (everything is run =
on FreeBSD 12.0-CURRENT (BEAGLEBONE) #0 r315413 mounted from the =
internal flash):

  # dd if=3D/dev/random of=3D/tmp/random.bin bs=3D1m count=3D40
  # dd if=3D/tmp/random.bin of=3D/dev/mmcsd1s2 bs=3D1m count=3D40

The initial results were promising, namely rates in the range from 12 to =
14 MB/s.

After formatting using: ...

  # newfs -ntUE -L SYSTEM /dev/mmcsd1s2a
  # mount -o noatime /dev/ufs/SYSTEM /mnt

... the results were eventually disappointing:

  # dd if=3D/tmp/random.bin of=3D/mnt/random1.bin bs=3D1m count=3D40
  11565980 bytes/sec

  # dd if=3D/tmp/random.bin of=3D/mnt/random2.bin bs=3D1m count=3D40
   8267796 bytes/sec

  # dd if=3D/tmp/random.bin of=3D/mnt/random3.bin bs=3D1m count=3D40
    615993 bytes/sec


In contrast to writing to the mounted root filesystem / on the internal =
flash:

  # dd if=3D/tmp/random.bin of=3D/random1.bin bs=3D1m count=3D40
  10798380 bytes/sec

  # dd if=3D/tmp/random.bin of=3D/random2.bin bs=3D1m count=3D40
  10510983 bytes/sec

  # dd if=3D/tmp/random.bin of=3D/random3.bin bs=3D1m count=3D40
  10740969 bytes/sec

Might it be, that FreeBSD 12 treats the UFS on the internal flash =
somehow different compared to UFS on the microSD? Perhaps trim works on =
the internal flash but not on mounted SD cards?

Anyway, I will buy a new card and we'll see whether this changes =
something.

Best regards

Rolf



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2F7D5F42-E50A-4761-9EEC-DC873BD7D0AB>