SD 卡写入限制 - 数据记录
Posted
技术标签:
【中文标题】SD 卡写入限制 - 数据记录【英文标题】:SD card write limit - data logging 【发布时间】:2014-08-12 23:04:04 【问题描述】:我想在我的系统(Raspberry Pi)关闭时进行跟踪/注册,通常是由于突然断电。
我想通过每 10 分钟将心跳记录到 SD 卡来做到这一点 - 所以每 10 分钟它会转到 SD 并将当前时间/日期写入文件中。从长远来看,这会损害 SD 吗?
如果它只有 10 万个写入周期,那么它会在几年内出现坏块。但我读过有电路可以防止它 - 它会防止坏块吗?将日志分布在几个块中会更安全吗?
谢谢
【问题讨论】:
这取决于您的 SD 卡的品牌和型号,但对于大多数现代卡,我认为您应该没问题。 【参考方案1】:这个问题的一般答案是“视情况而定”。 (实际的答案是你已经有了;如果你的文件系统参数没有错,那么在这种情况下你有很大的余量。)这取决于以下几点:
SD 卡类型 (SLC/MLC) SD 卡控制器(磨损均衡) SD 卡大小 文件系统 运气如果我们看一下闪存芯片,它被组织成扇区。扇区是可以完全擦除的区域(实际上重置为只有 1 的状态),对于 SD 卡,通常为 128 KiB。零可以逐位写入,但写入 1 的唯一方法是擦除扇区。
扇区擦除的次数是有限的。每次在同一扇区上执行擦除操作都会花费更长的时间,并且写入每个单元的值存在更多不确定性。给卡的写入限制实际上是单个扇区的擦除次数。
为了避免过快达到此限制,SD 卡有一个控制器负责磨损均衡。基本思想是,卡对用户透明地改变了哪些扇区被使用。如果请求相同的内存位置,可能会在不同的时间映射到不同的扇区。基本思想是卡有一个空扇区列表,当需要一个时,它会占用最少使用的一个。
还有其他算法。控制器可以跟踪扇区擦除时间或扇区上发生的错误。不幸的是,卡制造商通常不会过多地介绍确切的算法,但有关概述,请参阅:
http://en.wikipedia.org/wiki/Wear_leveling
有不同类型的闪存芯片可供选择。 SLC 芯片每个存储单元仅存储一位(0 或 1),MLC 单元存储两位或三位。自然,MLC 芯片对老化更为敏感。三位(八级)单元可能无法承受超过 1000 次写入。所以,如果你需要可靠性,尽管 SLC 卡价格更高,但还是要买,
随着磨损均衡将磨损分布在卡片上,较大的卡片比小卡片承受更多的扇区擦除,因为它们有更多的扇区。原则上,具有 100 000 次写入周期的 4 GiB 卡在其生命周期内将能够承载 400 TB 的数据。
但是为了让事情变得更复杂,文件系统与此有很大关系。当一小块数据被写入磁盘时,会发生很多不同的事情。至少将数据附加到文件中,并更改相关的目录信息(文件大小)。对于典型的文件系统,这意味着至少有两个 4 KiB 块写入,其中一个可能只是追加(不需要擦除)。但是可能会发生很多其他事情:写日记、块变满等等。
有些文件系统已经过调整以与闪存设备一起使用(JFFS2 是最常见的)。据我所知,它们都针对原始闪存进行了优化,并负责磨损均衡并使用位或八位字节级别的原子操作。我不知道有任何针对 SD 卡优化的文件系统。 (也许有学术兴趣的人可以创建一个考虑到卡的磨损均衡系统。这会产生一篇不错的论文,甚至一些。)幸运的是,通常的文件系统可以调整为更兼容(更快,领先通过调整文件系统参数与 SD 卡磨损)。
现在物理磁盘上有这两层,几乎不可能跟踪执行了多少次擦除。其中一层非常复杂(文件系统),另一层(磨损均衡)完全不透明。
所以,我们可以做一些粗略的估计。让我们猜测一个小的写入平均会使两个 4 KiB 块无效。这样每 10 分钟记录一次,每 160 分钟消耗 128 KiB 擦除扇区。如果卡是 8 GiB 卡,它有大约 64k 扇区,所以卡每 20 年通过一次。如果该卡能承受 1000 次写入周期,则可以使用 20 000 年...
上面的计算假设完美的磨损均衡和非常有效的文件系统。但是,1 000 的安全系数就足够了。
当然,这很容易被破坏。最简单的方法之一是忘记使用 noatime 属性安装磁盘。然后文件系统会更新文件访问时间,这可能导致每次访问(甚至读取)文件时都会写入。或者操作系统正在将虚拟内存交换到卡上。
最后但并非最不重要的因素是运气。现代 SD 卡不幸地倾向于死于其他原因。即使是相当知名的制造商的柠檬数量也不是很少。如果你杀了一张卡,那也不一定是因为磨损限制。如果卡磨损,它仍然可以读取。如果它完全死了,它是死于别的东西(静电,某处的小骨折)。
【讨论】:
感谢您抽出宝贵的时间撰写如此内容丰富的答案。以上是关于SD 卡写入限制 - 数据记录的主要内容,如果未能解决你的问题,请参考以下文章