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的联系人。
#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
评论
这是个有趣的问题。您报告的结果是多次运行的平均值,还是单次运行的平均值?我很想知道结果有多少变化。由于逻辑上的重新映射和损耗均衡,该问题的问题是“例如,在具有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性能。