为什么SD记录大小为8-128 kB的随机写入性能下降到记录大小为4 kB的性能以下?


15

当我检查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的结果:

使用iozone和50 MB文件大小进行测试时,随机写入的SD卡的性能下降

问题:记录大小为8、16、32、64和128 kB的记录速度比4 kB记录大小的记录慢的原因是什么?

Peter Brittain建议使用更大的文件大小进行测试,因此我也尝试了使用500 MB的文件进行测试。结果如下:

使用iozone和500 MB文件大小进行测试时,随机写入的SD卡的性能下降

总体性能变差,但现象仍然存在。

分区与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的回答):结果来自单次运行。该过程是:

  1. 将卡插入Raspberry Pi B型
  2. 引导系统
  3. 通过SSH登录
  4. 开始iozone测试运行
  5. 暂停系统并尝试使用另一张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 /产品编号。他们来了。

被测卡包装中的产品ID /品号

更新6:金士顿的技术支持告诉我,经测试的金士顿卡(以及最可能的其他卡)的控制器已针对4 kB的文件进行了优化。确切的控制器实现是机密的。金斯敦的答案是我得到的最好的答案。SanDisk从未响应过我的支持请求,我无法找到Sony,Samsung或Verbatim的联系人


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

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

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

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

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

Answers:


4

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 kb1 kb的分区所做的一样,但没有太大差异


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

也许某些控制器的规格可用。我可以打开SD卡并检查这些卡包含哪些控制器,但无法打开microSD卡。是否有可能通过软件读取SD卡控制器的产品ID /编号?
Neverland
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.