更新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卡的随机写入性能取决于擦除块大小,段大小和控制器缓存的段数。当我检查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



更新2(回答myaut):表的屏幕截图是我自己的工作。目前,我撰写有关单板计算机群集的文章/论文,因为它们是为学生项目和研究人员提供资源的一种有趣的选择。在这种情况下,我还研究了单个节点的CPU,存储和网络接口的性能。我已经购买了所有经过测试的SD卡。在其中一张卡上,我安装了Raspian Wheezy(通过dd复制)(2014-06-20版)。配置完网络设置并安装了一些其他软件包(例如iozone)后,我将整个SD卡复制到了所有其他SD卡上。

更新3(对Gabriel Southern的回答):结果来自单次运行。步骤是:


将卡插入Raspberry Pi Model B中
引导系统
通过SSH登录
开始iozone测试运行
暂停系统并尝试使用另一张SD卡。

我多次尝试对某些卡进行仔细检查。几乎没有变化。除两张三星卡和一张威宝卡外,这种现象一直在发生。

更新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的联系人。

评论

这是个有趣的问题。您报告的结果是多次运行的平均值,还是单次运行的平均值?我很想知道结果有多少变化。

由于逻辑上的重新映射和损耗均衡,该问题的问题是“例如,在具有4 MB分段大小的SD卡上,将4 kB数据写入随机位置会导致写入放大系数为1024。”是错误的。

在我的经验性能测试中,您在较小规模的测试中遇到了各种优化和缓存。特别是,我可以相信闪存速度较慢的制造商将需要进行这些优化,以有效地处理文件系统更新,但是由于缺少所有控制器的公共文档,因此无法证明这一点。就是说,我注意到您仅使用50MB的文件。您是否尝试过更大的文件(按照iozone.org/docs/IOzone_msword_98.pdf中的“运行规则”)来尝试解决此问题?

假设您没有区别,我就此事寻找了其他数据。看起来Linaro组织已经做了一些类似的研究。特别是,超大的SLC缓存可能会解释您的快速结果。 FAT32优化将专门针对小型写入。

是的-已经在页面中发现了该问题……不过,我认为FAT32可能会丢失一些东西:这些卡已针对“在FAT32上观察到的访问模式”进行了优化,而不仅仅是针对FAT32。 FAT上的典型访问模式是写入新文件-这需要流式传输文件数据以及FAT更新。 FAT更新通常将涉及少量块。如果我正在编写FTL,那么我将计划优化所有小于页面大小的写操作,以提高FAT性能。

#1 楼

SD卡单元的结构:在固态电子设备中,单元是一种能够存储一个或多个信息位的存储元件,每个单元的位数取决于所使用的技术。 (SLC / MLC / TLC)制造商在闪存中使用不同的技术来管理其结构,由于与这些技术(尤其是TLC)相关的成本较低,因此最常用的结构是TLC和MLC。

制造商认为,对于SD卡和USB记忆棒很难获得此技术信息,因此对于其他类似闪存的技术,几乎总是提供此信息的SSD。

这直接影响硬件寿命,但也影响速度。

SLC,单级单元(1位)

Generally 100000 write erase cycles
Erase time: 1-2.5ms


MLC,多层单元(2个或更多位)

Anywhere from 3000 to 15000 write erase cycles
Erase time: 2.5-3.5ms


TLC,三层单元(3位)

Anywhere from 1000 to 5000 write/erase cycles
Erase time: 4-5ms


注意:

由于单元在某些情况下可能包含1位,2位或3位,因此根据记录,您的sd卡控制器芯片将需要执行更多的访问周期大小和单元格容量。

您的Samsung卡可能正在使用SLC技术,或者它们具有功能强大的控制器芯片。

注2:

我尝试了一些像ext4块大小为4 kb和1 kb的ext4分区一样的测试,但没有太大差异

评论


三星卡和威宝卡是消费类产品,并且在最近几年中,SLC存储器在此类设备中并不常见。三星卡为MB-MP16D和MB-MS16D,逐字记录卡的货号为44007。

–梦幻岛
2015年6月25日13:22

也许某些控制器的规格可用。我可以打开SD卡并检查这些卡包含哪些控制器,但无法打开microSD卡。是否有可能通过软件读取SD卡控制器的产品ID /编号?

–梦幻岛
15年6月25日在13:30