当我检查SD卡的性能以进行随机写入时,我发现对于4 kB的记录大小,该性能相当差(这并不奇怪),但是对于几张卡,对于更大的记录大小,它甚至在增大之前就下降了。我使用iozone v3.430测量了随机写入性能,并测试了不同制造商的几款闪存卡。这是iozone命令,我用来测量文件大小为50 MB:
iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile
这是文件大小为50 MB的结果:
问题:记录大小为8、16、32、64和128 kB的记录速度比4 kB记录大小的记录慢的原因是什么?
Peter Brittain建议使用更大的文件大小进行测试,因此我也尝试了使用500 MB的文件进行测试。结果如下:
总体性能变差,但现象仍然存在。
分区与4 MB边界对齐。文件系统是ext4,块大小为4 kB。用于测试的分区开始于mmcblk0p2。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 953.7M 0 loop /mnt/sdb1
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 56M 0 part /boot
├─mmcblk0p2 179:2 0 7.8G 0 part /
└─mmcblk0p3 179:3 0 7G 0 part /mnt/mmcblk0p3
$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 16506879 8192000 83 Linux
/dev/mmcblk0p3 16506880 31115263 7304192 83 Linux
$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)
# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count: 2048000
Block size: 4096
Blocks per group: 32768
更新1:很明显,与顺序写入相比,随机写入的性能(尤其是小记录大小)明显降低。NAND闪存的存储单元被分组为页面,即所谓的擦除块。典型的页面大小为4、8或16 kB。尽管控制器可以写单个页面,但是如果不先擦除就不能覆盖数据,而擦除块是NAND闪存可以擦除的最小单元。擦除块的大小通常在128 kB和2 MB之间。在现代SD卡中,少量的擦除块被组合成大小相等的较大单元,这些单元称为分配组或分配单元或段。通常的段大小为4 MB。存储器上的每个写操作都会导致整个段的读-修改-写操作。例如,在具有4 MB分段大小的SD卡上,将4 kB数据写入随机位置会导致写入放大系数为1024。SD 卡的控制器实现了转换层。对于任何I / O操作,控制器都会执行从虚拟地址到物理地址的转换。如果段内的数据将被覆盖,则转换层会将段的虚拟地址重新映射到另一个已擦除的物理地址。旧的物理段被标记为脏,并排队等待擦除。以后,当它被擦除时,可以重复使用。SD卡的控制器通常会缓存一个或多个段,以提高随机写入操作的性能。如果SD卡存储了根文件系统,则有益的是,卡的控制器可以缓存发生写操作的段,存储文件系统元数据的段和(如果可用)文件系统的日志。因此,SD卡的随机写入性能取决于擦除块大小,段大小和控制器缓存的段数。但这并不能解释为什么记录大小为8、16、32、64和128 kB的随机写入性能比4 kB的记录大小要慢。
更新2(回答myaut):表格的屏幕截图是我自己的工作。目前,我撰写有关单板计算机群集的文章/论文,因为它们是为学生项目和研究人员提供资源的有趣选择。在这种情况下,我还研究了单个节点的CPU,存储和网络接口的性能。我已经购买了所有经过测试的SD卡。在其中一张卡上,我安装了Raspian Wheezy(通过dd复制)(2014-06-20版)。配置网络设置并安装一些其他软件包(例如iozone)后,我将整个SD卡复制到了所有其他SD卡上。
更新3(对Gabriel Southern的回答):结果来自单次运行。该过程是:
- 将卡插入Raspberry Pi B型
- 引导系统
- 通过SSH登录
- 开始iozone测试运行
- 暂停系统并尝试使用另一张SD卡
我几次尝试对某些卡片进行仔细检查。几乎没有变化。除了两张三星卡和一张Verbatim卡以外,这种现象一直在发生。
更新4:目前,我试图与一家生产NAND闪存克隆程序的公司(三星,SanDisk,东芝...)建立联系,以便在那里寻求明确的答案。SanDisk有一个论坛。我在那里要求解释。我还向金斯敦的技术支持部门发送了请求。
更新5:擦除块大小和分配单元(段)的大小与现象无关。我在ThinkPad X240笔记本电脑的内部读卡器中使用pritcsd.py工具拳头,最后在Raspberry Pi Model B中测试了所有SD卡的擦除块大小。对于所有卡,输出均为:Erase block size of mmcblk0 is 65536 bytes
。此外,所有测试的SD卡的段大小均相等。这是4 MB。可以在文件中 找到此信息/sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size
。我认为所有这些卡具有相同的擦除块大小和段大小是非常不寻常的。同时,我从被测试卡的包装中收集了产品ID /产品编号。他们来了。
更新6:金士顿的技术支持告诉我,经测试的金士顿卡(以及最可能的其他卡)的控制器已针对4 kB的文件进行了优化。确切的控制器实现是机密的。金斯敦的答案是我得到的最好的答案。SanDisk从未响应过我的支持请求,我无法找到Sony,Samsung或Verbatim的联系人