This is just a non-destructive read test. Sometimes read performance when spanning two eraseblocks will be slower than when reading only in one erase block. The “pre” reads just prior to an expected eraseblock boundary, the “on” reads spanning an eraseblock boundary, and the “post” reads just after an eraseblock boundary. Any spot where the “diff” times drop dramatically may indicate the likely eraseblock size or the likely write page size (write page size will always be smaller than an eraseblock).
上面这段话是从别的地方摘过来的,个人理解align测试的主要原理是跨erase block size读取n个字节的时间与在同一个erase block size读取n个字节的时间是不一样的。测试page size的原理也是一样的。
~ # flashbench -a -b 1024 /dev/mmcblk0
align 2147483648 pre 678us on 910us post 682us diff 230us
align 1073741824 pre 778us on 1.08ms post 754us diff 314us
align 536870912 pre 764us on 1.02ms post 736us diff 271us
align 268435456 pre 744us on 994us post 762us diff 242us
align 134217728 pre 774us on 1.05ms post 688us diff 314us
align 67108864 pre 738us on 984us post 725us diff 253us
align 33554432 pre 756us on 1.03ms post 740us diff 279us
align 16777216 pre 739us on 1.02ms post 725us diff 292us
align 8388608 pre 704us on 950us post 694us diff 251us
align 4194304 pre 694us on 937us post 689us diff 246us
align 2097152 pre 698us on 825us post 697us diff 127us
align 1048576 pre 694us on 783us post 701us diff 85us
align 524288 pre 695us on 785us post 706us diff 84.7us
align 262144 pre 696us on 784us post 706us diff 83.4us
align 131072 pre 691us on 780us post 705us diff 82.5us
align 65536 pre 691us on 781us post 704us diff 82.9us
align 32768 pre 697us on 786us post 710us diff 82.3us
align 16384 pre 702us on 779us post 691us diff 82.4us
align 8192 pre 696us on 735us post 698us diff 37.7us
align 4096 pre 699us on 735us post 698us diff 36.5us
align 2048 pre 700us on 734us post 696us diff 35.5us
~ # flashbench -a -b 1024 /dev/mmcblk0
align 2147483648 pre 672us on 905us post 668us diff 235us
align 1073741824 pre 779us on 1.07ms post 751us diff 308us
align 536870912 pre 767us on 1.02ms post 728us diff 269us
align 268435456 pre 740us on 997us post 766us diff 244us
align 134217728 pre 772us on 1.04ms post 683us diff 315us
align 67108864 pre 730us on 982us post 721us diff 256us
align 33554432 pre 744us on 1.02ms post 730us diff 286us
align 16777216 pre 740us on 1.03ms post 728us diff 293us
align 8388608 pre 694us on 943us post 693us diff 249us
align 4194304 pre 692us on 936us post 683us diff 249us
align 2097152 pre 696us on 817us post 693us diff 123us
align 1048576 pre 693us on 781us post 703us diff 83.5us
align 524288 pre 693us on 788us post 707us diff 87.9us
align 262144 pre 693us on 780us post 704us diff 81.9us
align 131072 pre 691us on 779us post 705us diff 81.3us
align 65536 pre 694us on 779us post 701us diff 81.7us
align 32768 pre 693us on 785us post 701us diff 87.6us
align 16384 pre 701us on 774us post 691us diff 78us
align 8192 pre 695us on 734us post 699us diff 36.7us
align 4096 pre 699us on 733us post 699us diff 34.3us
align 2048 pre 698us on 732us post 697us diff 35.1us
~ #
~ # flashbench -a -b 2048 /dev/mmcblk0
align 2147483648 pre 705us on 921us post 701us diff 219us
align 1073741824 pre 792us on 1.08ms post 776us diff 301us
align 536870912 pre 789us on 1.03ms post 752us diff 262us
align 268435456 pre 761us on 1.01ms post 785us diff 234us
align 134217728 pre 798us on 1.06ms post 708us diff 303us
align 67108864 pre 756us on 997us post 747us diff 246us
align 33554432 pre 759us on 1.04ms post 751us diff 282us
align 16777216 pre 758us on 1.03ms post 744us diff 282us
align 8388608 pre 722us on 962us post 716us diff 242us
align 4194304 pre 714us on 956us post 712us diff 243us
align 2097152 pre 723us on 835us post 719us diff 114us
align 1048576 pre 719us on 794us post 727us diff 70.6us
align 524288 pre 721us on 803us post 730us diff 77us
align 262144 pre 719us on 795us post 728us diff 71.3us
align 131072 pre 717us on 790us post 728us diff 67.6us
align 65536 pre 720us on 797us post 729us diff 72.7us
align 32768 pre 718us on 799us post 727us diff 76.4us
align 16384 pre 727us on 790us post 716us diff 68.4us
align 8192 pre 722us on 749us post 724us diff 26us
align 4096 pre 720us on 745us post 719us diff 25.7us
~ #
~ # flashbench -a -b 4096 /dev/mmcblk0
align 2147483648 pre 756us on 943us post 756us diff 187us
align 1073741824 pre 846us on 1.11ms post 828us diff 276us
align 536870912 pre 848us on 1.05ms post 802us diff 228us
align 268435456 pre 803us on 1.03ms post 840us diff 209us
align 134217728 pre 843us on 1.08ms post 759us diff 280us
align 67108864 pre 806us on 1.02ms post 797us diff 220us
align 33554432 pre 805us on 1.06ms post 810us diff 253us
align 16777216 pre 813us on 1.05ms post 800us diff 246us
align 8388608 pre 764us on 991us post 771us diff 224us
align 4194304 pre 773us on 985us post 763us diff 217us
align 2097152 pre 762us on 857us post 768us diff 91.9us
align 1048576 pre 783us on 827us post 781us diff 44.6us
align 524288 pre 766us on 824us post 787us diff 47.6us
align 262144 pre 775us on 819us post 783us diff 40.1us
align 131072 pre 769us on 813us post 784us diff 37.1us
align 65536 pre 774us on 822us post 781us diff 44.5us
align 32768 pre 771us on 825us post 781us diff 48.6us
align 16384 pre 778us on 816us post 779us diff 37.5us
align 8192 pre 773us on 770us post 773us diff -2926ns
~ #
~ # flashbench -a -b 8192 /dev/mmcblk0
align 2147483648 pre 861us on 1.06ms post 859us diff 195us
align 1073741824 pre 956us on 1.22ms post 937us diff 272us
align 536870912 pre 952us on 1.17ms post 911us diff 235us
align 268435456 pre 905us on 1.13ms post 944us diff 203us
align 134217728 pre 948us on 1.19ms post 870us diff 279us
align 67108864 pre 912us on 1.12ms post 924us diff 202us
align 33554432 pre 920us on 1.16ms post 917us diff 244us
align 16777216 pre 908us on 1.16ms post 921us diff 242us
align 8388608 pre 870us on 1.09ms post 878us diff 216us
align 4194304 pre 872us on 1.08ms post 871us diff 209us
align 2097152 pre 874us on 951us post 874us diff 76.9us
align 1048576 pre 879us on 927us post 884us diff 45.6us
align 524288 pre 873us on 929us post 896us diff 44.7us
align 262144 pre 887us on 931us post 895us diff 39.8us
align 131072 pre 882us on 925us post 887us diff 40us
align 65536 pre 881us on 936us post 883us diff 54.5us
align 32768 pre 884us on 932us post 884us diff 48us
align 16384 pre 887us on 926us post 879us diff 43.2us
~ #
~ # flashbench -a -b 16384 /dev/mmcblk0
align 2147483648 pre 1.05ms on 1.24ms post 1.09ms diff 165us
align 1073741824 pre 1.15ms on 1.42ms post 1.13ms diff 279us
align 536870912 pre 1.15ms on 1.37ms post 1.11ms diff 235us
align 268435456 pre 1.1ms on 1.32ms post 1.15ms diff 196us
align 134217728 pre 1.15ms on 1.39ms post 1.08ms diff 277us
align 67108864 pre 1.11ms on 1.33ms post 1.11ms diff 212us
align 33554432 pre 1.1ms on 1.36ms post 1.12ms diff 254us
align 16777216 pre 1.1ms on 1.36ms post 1.12ms diff 250us
align 8388608 pre 1.07ms on 1.28ms post 1.09ms diff 201us
align 4194304 pre 1.08ms on 1.27ms post 1.07ms diff 197us
align 2097152 pre 1.08ms on 1.15ms post 1.08ms diff 72.7us
align 1048576 pre 1.1ms on 1.14ms post 1.09ms diff 47.1us
align 524288 pre 1.08ms on 1.13ms post 1.1ms diff 40.7us
align 262144 pre 1.09ms on 1.14ms post 1.1ms diff 43.2us
align 131072 pre 1.09ms on 1.14ms post 1.1ms diff 44.4us
align 65536 pre 1.09ms on 1.13ms post 1.09ms diff 44.3us
align 32768 pre 1.09ms on 1.14ms post 1.09ms diff 50us
~ #
~ # flashbench -a -b 32768 /dev/mmcblk0
align 2147483648 pre 1.56ms on 1.64ms post 1.59ms diff 62.1us
align 1073741824 pre 1.65ms on 1.82ms post 1.58ms diff 205us
align 536870912 pre 1.65ms on 1.77ms post 1.57ms diff 163us
align 268435456 pre 1.59ms on 1.71ms post 1.6ms diff 110us
align 134217728 pre 1.64ms on 1.79ms post 1.55ms diff 193us
align 67108864 pre 1.6ms on 1.72ms post 1.58ms diff 131us
align 33554432 pre 1.59ms on 1.74ms post 1.58ms diff 154us
align 16777216 pre 1.6ms on 1.76ms post 1.58ms diff 176us
align 8388608 pre 1.54ms on 1.67ms post 1.54ms diff 124us
align 4194304 pre 1.54ms on 1.67ms post 1.53ms diff 133us
align 2097152 pre 1.54ms on 1.56ms post 1.52ms diff 26.9us
align 1048576 pre 1.57ms on 1.56ms post 1.55ms diff 6.15us
align 524288 pre 1.55ms on 1.56ms post 1.57ms diff 4.59us
align 262144 pre 1.55ms on 1.57ms post 1.56ms diff 13.4us
align 131072 pre 1.55ms on 1.56ms post 1.57ms diff 5.72us
align 65536 pre 1.54ms on 1.56ms post 1.55ms diff 11.7us
~ #
what is copy-and-write-then-erase ?
if you want to change just one bit within an eraseblock the controller will often copy the entire eraseblock contents to another eraseblock but with your one bit change. The controller will then set the old eraseblock to be erased, possibly in the background.
we can check if the first few eraseblocks have any special ability. Some cards will provide for the first few eraseblocks to be backed by SLC flash instead of MLC, or otherwise improve the performance of these special eraseblocks. This is important when using the card with the FAT filesystem as all the metadata is stored in the beginning of the disk and will get the most wear and small writes.
flashbench --scatter --scatter-order=N --scatter-span=N -b blocksize /dev/mmcblk0 -o /tmp/scatter_result
it is mainly a way to detect the block size if the -a test gives no conclusive result
–scatter
–scatter-order=M 定义scatter测试读取的区域,那么读取的区域的总大小为blocksize * 2^M (-b指定blocksize大小)
–scatter-span=N 一次读取的block的数量,那么一次读取的大小为blocksize * 2^N
-b 指定blocksize大小
-o 指定测试结果的输出文件
然后使用工具gnuplot将scatter_result绘制成二维图像,gnuplot -p -e ‘plot “scatter_result”’。
第一列代表每次读写文件的大小,测试的原理是写4M的文件,对于2M的大小,测试两次,对于1M的大小,测试4次,依次类推。
后面的几列依次是linear write zeros, linear write ones, linear write 0x5a, linear read,
random write zeros, random write ones, random write 0x5a, random read的速度
Create a file with the required capacity, filled with random data. We’re writing blocks of 1024 bytes, so adjust the count to the capacity required (16GB in my case). dd if=/dev/urandom of=rnd_init_data bs=1024 count=16000000
You can see, we didn’t manage to write all the bytes to the card. This is expected, as we don’t know the capacity of the card down to the last byte. As long as the capacity reported by dd (16 GB) is close to the expected result, we’re happy.
Now, we copy the bytes written to a new file, which we use for later comparison. Notice here the count, which we adapted to the bytes written to the card (15931539456 / 1024 = 15558144). I am sure this can be done easier using tools like truncate, but I didn’t want to start messing with programs that I don’t know by heart.