Everyone has this special day in a year when you receive gifts (they call it birthday but I'm too old already to celebrate. Old enough to try to forgot that earth make yet another full round around the sun and your head become more "blond" than you checked last time ;)
So I got SanDisk 64GB USB flash drive which is advertised to give 100MB/s of transfer speed. It uses USB 3.0 so I decided to give it a try and verify those claims. Another reason was my brother (who gave me this) "taunts" that "Windows handle it better" ;)
So I made simple "dd" test, with RAW read and write without any file system.
# sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
# dd of=/dev/sdc if=/dev/zero bs=64M oflag=dsync,direct iflag=fullblock & echo $!; while sudo kill -SIGUSR1 $!; do sleep 1; done
[1] 22786
22786
0+0 records in
0+0 records out
0 bytes copied, 0,00882205 s, 0,0 kB/s
1+0 records in
1+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 1,82117 s, 36,8 MB/s
2+0 records in
2+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 3,39514 s, 39,5 MB/s
3+0 records in
3+0 records out
201326592 bytes (201 MB, 192 MiB) copied, 5,00308 s, 40,2 MB/s
4+0 records in
4+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 6,58802 s, 40,7 MB/s
5+0 records in
5+0 records out
335544320 bytes (336 MB, 320 MiB) copied, 8,37488 s, 40,1 MB/s
# killall dd
# sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
# dd if=/dev/sdc of=/dev/null bs=64M iflag=fullblock,dsync,direct & echo $!; while sudo kill -
[2] 31336
31336
1+0 records in
0+0 records out
0 bytes copied, 0,57976 s, 0,0 kB/s
2+0 records in
1+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 1,13625 s, 59,1 MB/s
4+0 records in
3+0 records out
201326592 bytes (201 MB, 192 MiB) copied, 2,25124 s, 89,4 MB/s
6+0 records in
5+0 records out
335544320 bytes (336 MB, 320 MiB) copied, 3,36255 s, 99,8 MB/s
8+0 records in
7+0 records out
469762048 bytes (470 MB, 448 MiB) copied, 4,47168 s, 105 MB/s
10+0 records in
9+0 records out
603979776 bytes (604 MB, 576 MiB) copied, 5,58709 s, 108 MB/s
11+0 records in
10+0 records out
671088640 bytes (671 MB, 640 MiB) copied, 6,14454 s, 109 MB/s
13+0 records in
12+0 records out
805306368 bytes (805 MB, 768 MiB) copied, 7,25453 s, 111 MB/s
15+0 records in
14+0 records out
939524096 bytes (940 MB, 896 MiB) copied, 8,3586 s, 112 MB/s
17+0 records in
16+0 records out
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 9,46021 s, 114 MB/s
Looks like ~40MB/s for write and ~100MB/s for read. So .... yes, this is as advertised by SanDisk. You just need to look at those little stars placed near the numbers. You will find their meaning at the other side of the box. They claim 100MB/s for reading and up to 10x times of standard drive speed (4MB/s) for writing.
But I wonder how well my system behave when I would use this drive together with some file system. The most obvious choice is VFAT.
mkfs is your best friend. Let's use default parameters then.
# mkfs.vfat /dev/sdc1
mkfs.fat 3.0.28 (2015-05-16)
# fsck.vfat /dev/sdc1 -v
fsck.fat 3.0.28 (2015-05-16)
Checking we can access the last sector of the filesystem
Boot sector contents:
System ID "mkfs.fat"
Media byte 0xf8 (hard disk)
512 bytes per logical sector
32768 bytes per cluster
32 reserved sectors
First FAT starts at byte 16384 (sector 32)
2 FATs, 32 bit entries
7580160 bytes per FAT (= 14805 sectors)
Root directory start at cluster 2 (arbitrary size)
Data area starts at byte 15176704 (sector 29642)
1894928 data clusters (62093000704 bytes)
32 sectors/track, 64 heads
2048 hidden sectors
121305055 sectors total
Checking for unused clusters.
Checking free cluster summary.
/dev/sdc1: 0 files, 1/1894928 clusters
# cd /media/rad/837C-93FB/
# dd of=./test1.txt if=/dev/zero bs=32M oflag=dsync mount=1000 & echo $!; while sudo kill -SIGUSR1 $!; do sleep 1; done
[1] 9897
9897
0+0 records in
0+0 records out
0 bytes copied, 0,0124351 s, 0,0 kB/s
0+1 records in
0+1 records out
18821120 bytes (19 MB, 18 MiB) copied, 1,0552 s, 17,8 MB/s
1+1 records in
1+1 records out
52375552 bytes (52 MB, 50 MiB) copied, 2,47131 s, 21,2 MB/s
2+1 records in
2+1 records out
85929984 bytes (86 MB, 82 MiB) copied, 4,14265 s, 20,7 MB/s
3+1 records in
3+1 records out
119484416 bytes (119 MB, 114 MiB) copied, 5,55161 s, 21,5 MB/s
4+1 records in
4+1 records out
153038848 bytes (153 MB, 146 MiB) copied, 7,0338 s, 21,8 MB/s
5+1 records in
5+1 records out
186593280 bytes (187 MB, 178 MiB) copied, 8,69431 s, 21,5 MB/s
6+1 records in
6+1 records out
220147712 bytes (220 MB, 210 MiB) copied, 10,1471 s, 21,7 MB/s
What the f... ? ~21MB/s !!!!
So after a while I realized that this is probably due default sector size. Lets try to reformat for 4k sector size:
# mkfs.vfat /dev/sdc1 -S 4096 -s 1
mkfs.fat 3.0.28 (2015-05-16)
# fsck.vfat /dev/sdc1 -v
fsck.fat 3.0.28 (2015-05-16)
Checking we can access the last sector of the filesystem
Boot sector contents:
System ID "mkfs.fat"
Media byte 0xf8 (hard disk)
4096 bytes per logical sector
4096 bytes per cluster
32 reserved sectors
First FAT starts at byte 131072 (sector 32)
2 FATs, 32 bit entries
60534784 bytes per FAT (= 14779 sectors)
Root directory start at cluster 2 (arbitrary size)
Data area starts at byte 121200640 (sector 29590)
15133546 data clusters (61987004416 bytes)
32 sectors/track, 64 heads
2048 hidden sectors
15163136 sectors total
Checking for unused clusters.
Checking free cluster summary.
/dev/sdc1: 0 files, 1/15133546 clusters
root@rad-desktop:/media/rad# cd
0AC2-20C2/ dysk/
root@rad-desktop:/media/rad# cd 0AC2-20C2/
root@rad-desktop:/media/rad/0AC2-20C2# dd of=./test.txt if=/dev/zero bs=64M oflag=dsync,direct iflag=fullblock & echo $!; while sudo kill -SIGUSR1 $!; do sleep 1; done
[1] 21689
21689
0+0 records in
0+0 records out
0 bytes copied, 0,0138234 s, 0,0 kB/s
1+0 records in
1+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 2,02883 s, 33,1 MB/s
1+0 records in
1+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 2,03412 s, 33,0 MB/s
2+0 records in
2+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 3,77909 s, 35,5 MB/s
3+0 records in
3+0 records out
201326592 bytes (201 MB, 192 MiB) copied, 5,97208 s, 33,7 MB/s
4+0 records in
4+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 7,93711 s, 33,8 MB/s
5+0 records in
5+0 records out
335544320 bytes (336 MB, 320 MiB) copied, 9,74674 s, 34,4 MB/s
6+0 records in
6+0 records out
402653184 bytes (403 MB, 384 MiB) copied, 11,8841 s, 33,9 MB/s
7+0 records in
7+0 records out
469762048 bytes (470 MB, 448 MiB) copied, 13,8475 s, 33,9 MB/s
^C
35MB/s ... hmmm. So the reason for this is native sector size of the flash drive. It seems that the device advertise 512B as native sector size but it internally use 4k. Because of this each write operation need to be combined in the firmware of the drive which degrades the performance.
I was to lazy to check, what the mkfs.vfat tools would do if drive would report 4k sectors. I suppose that it should use bigger FAT sectors but that's only a wild guess (or rather a wish).
Now, you probably wonder... How many of wrongly formatted flash drives are in your possession? ;)