问题描述:64GByte的SDNAND,速度和一次写多少个block有关,一次写1个block速度不到1MB/s,一次写40个block写入速度接近8MB/s。传输量越小速度越慢怎么回事?
问题解答:这深刻地揭示了SD/NAND Flash类存储设备的一个核心工作原理。下面我来为您详细解释一下原因,并确认您的理解。
对SD/NAND存储设备的每一次写操作,无论数据量大小,都包含一系列固定开销。这些开销主要包括:
命令传输 :主机发送写命令(CMD25)和地址。
响应等待 :设备回应命令。
数据开始令牌 :在发送实际数据前,先发送一个起始令牌。
写入过程 :数据被写入到闪存单元中。这是最耗时的物理过程,但其时间相对固定(与写入量不完全成线性正比)。
状态查询与响应 :数据写入完成后,设备会返回一个响应令牌,告知主机写入状态(成功/失败)。
块间隙 :在多块写入中,块与块之间可能有很小的间隔。
关键点在于: 上述的1、2、3、5、6步骤的耗时是相对固定的。当您只写1个Block(512字节)时,这512字节的有效数据被巨大的固定开销所“淹没”,导致效率极低。
写入1个Block(512字节)
固定开销时间:假设为 T_overhead
。
有效数据传输时间:传输512字节所需的时间,假设为 T_data_1
。
总时间 ≈ T_overhead + T_data_1
有效速度 = 512 Bytes / (T_overhead + T_data_1
) ≈ 不到1MB/s。
此时,T_overhead
占据了总时间的绝大部分。
写入40个Block(20,480字节)
固定开销时间:几乎与写1个Block时相同,仍然是 T_overhead
。(多块写入的块间隙开销很小)。
有效数据传输时间:传输20KB所需的时间,假设为 T_data_40
。这大约是 T_data_1
的40倍。
总时间 ≈ T_overhead + T_data_40
有效速度 = 20,480 Bytes / (T_overhead + T_data_40
) ≈ 接近8MB/s。
此时,T_data_40
占据了总时间的绝大部分,固定开销 T_overhead
被均摊到了大量数据上,因此效率大大提高。
您的这个结论——“一次最少要写16个块(8KB)才是正确的”——是一个非常精辟的实践总结。
这背后的原理是:
协议优化:SD协议设计时就已经考虑到了这一点,因此提供了多块写入 命令。主机可以发送一个起始命令,然后连续发送多个数据块,最后以一个停止命令结束。这极大地减少了命令和响应带来的固定开销。
文件系统对齐:很多文件系统的簇大小默认就是4KB或8KB。如果您每次写入的数据量小于这个值,文件系统底层仍然可能需要执行“读-改-写”操作,这会进一步降低效率。一次写入8KB(16个扇区)或其整数倍,可以很好地与文件系统配合,实现最高效的写入。
控制器缓冲:SDNAND内部的控制器也有自己的缓存。一次性提交更多数据,可以让控制器更好地进行磨损均衡、坏块管理等内部操作,从而优化写入寿命和速度。
所以,“一次写入至少8KB(16个块)”是一个极佳的性能拐点。低于这个值,性能会急剧下降;高于这个值,性能会持续提升并逐渐趋于饱和(当固定开销可以完全忽略时)。
您的观察完全正确:SD/NAND的写入速度与单次写入的数据量强相关,核心原因是固定开销的均摊。
您的结论非常准确:为了获得良好的写入性能,应该尽可能使用多块写入,并且单次写入量建议不小于8KB。
最佳实践:
在您的驱动或应用程序中,启用并使用多块写入功能。
尽量将小数据打包,凑够至少8KB(例如16个Block)再一次性写入。可以设计一个数据缓冲队列。
如果条件允许,一次写入32个、64个甚至更多块,速度会进一步接近芯片的物理极限。
通过您的这次实践,您已经抓住了优化嵌入式存储性能的一个最关键要点。
上一篇:rk3568 驱动sdnand
下一篇:没有了!
电话:176-6539-0767
Q Q:135-0379-986
邮箱:1350379986@qq.com
地址:深圳市南山区后海大道1021号C座