On Thursday 07 June 2012, David Brown wrote:
On Wed, Jun 06, 2012 at 07:11:37AM +0000, Arnd Bergmann wrote:
If you don't need the data on your card, could you run these commands on yours:
for i in 2 3 30 31 ; do sudo flashbench --open-au --open-au-nr=30 --erasesize=$[512 * 1024] \ /dev/mmcblk0 --offset=$[24*1024*1024] done
Did you mean to use $i somewhere in that loop?
oops, yes it should be "--open-au-nr=$i"
I ran it with the command given above (just once since it doesn't mention $i). Also, this is on a USB card reader. I'd have to get a bit more creative to be able to run this on my target, since the card is also the root filesystem.
USB card reader is fine for this test.
512KiB 962K/s 256KiB 398K/s 128KiB 201K/s 64KiB 101K/s 32KiB 152K/s 16KiB 719K/s
FWIW, these are the results for the "good" card:
for i in 2 3 30 31 ; do echo == $i == ; sudo ./flashbench --open-au --open-au-nr=$i --erasesize=$[512 * 1024] /dev/mmcblk0 --offset=$[24*1024*1024] ; done == 2 == 512KiB 7.42M/s 256KiB 7.65M/s 128KiB 7.64M/s 64KiB 7.41M/s 32KiB 6.46M/s 16KiB 4.78M/s == 3 == 512KiB 7.9M/s 256KiB 8.06M/s 128KiB 8.2M/s 64KiB 8.35M/s 32KiB 6.61M/s 16KiB 3.95M/s == 30 == 512KiB 8.41M/s 256KiB 8.21M/s 128KiB 8.16M/s 64KiB 8.32M/s 32KiB 6.76M/s 16KiB 4.31M/s == 31 == 512KiB 8.08M/s 256KiB 7.41M/s 128KiB 6.73M/s 64KiB 5.73M/s 32KiB 3.87M/s 16KiB 1.78M/s
note how for values up to open-au-nr=30 the performance is stable for all block sizes over 64k and only degrades a little below that, while for open-au-nr=31 it gets much slower for small block sizes.
The "bad" card looks very similar to yours: for i in 2 3 30 31 ; do echo == $i == ; sudo ./flashbench --open-au --open-au-nr=$i --erasesize=$[512 * 1024] /dev/mmcblk0 --offset=$[24*1024*1024] ; done == 2 == 512KiB 382K/s 256KiB 232K/s 128KiB 272K/s 64KiB 535K/s 32KiB 521K/s 16KiB 1.21M/s == 3 == 512KiB 393K/s 256KiB 176K/s 128KiB 223K/s 64KiB 606K/s 32KiB 585K/s 16KiB 976K/s == 30 == 512KiB 752K/s 256KiB 359K/s 128KiB 191K/s 64KiB 103K/s 32KiB 145K/s 16KiB 827K/s == 31 == ^C (I skipped this one, it's rather pointless)
The effect becomes much more visible by trying erasesize=4MB:
for i in 2 3 4 ; do echo == $i == ; sudo ./flashbench --open-au --open-au-nr=$i --erasesize=$[4096 * 1024] /dev/mmcblk0 --offset=$[24*1024*1024] ; done == 2 == 4MiB 3.09M/s 2MiB 4.93M/s 1MiB 5.52M/s 512KiB 5.52M/s 256KiB 5.53M/s 128KiB 5.51M/s 64KiB 5.52M/s 32KiB 4.51M/s 16KiB 1.87M/s == 3 == 4MiB 4.34M/s 2MiB 3.61M/s 1MiB 1.67M/s 512KiB 1.48M/s 256KiB 1.39M/s 128KiB 1.21M/s 64KiB 1.14M/s 32KiB 1.03M/s 16KiB 2.08M/s == 4 == 4MiB 5.52M/s 2MiB 3.45M/s 1MiB 1.65M/s 512KiB 826K/s 256KiB 414K/s 128KiB 208K/s 64KiB 104K/s 32KiB 247K/s 16KiB 2.24M/s
So this card can handle 2 open AUs just fine, three of them barely, but not 4 or more, which is not a particular good behavior. For any block sizes of 16kb or smaller, this card does provide some form of caching though that makes up for this problem to some degree.
Arnd