SD卡写入限制-数据记录

12

我想追踪/注册我的系统(一个树莓派)何时被关闭,通常是由于突然断电导致。

我想通过每10分钟记录一次心跳到SD卡来实现它-所以每10分钟它都会去SD卡并在文件中写入当前的时间/日期。这样做长期会损坏SD卡吗?

如果只有100k个写入循环次数,那么几年后就会有坏块。但我已经读到有防止它的电路-它会防止坏块吗?将日志分布在几个块中是否更安全?

谢谢


这将取决于您的SD卡的品牌和型号,但对于大多数现代卡而言,我认为您应该没问题。 - The Velcromancer
1个回答

29
这个问题的一般答案是强烈“视情况而定”。(如果您的文件系统参数没有问题,那么在这种情况下你已经有了一个很大的余地。)它取决于以下因素:
  • 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分钟记录一次日志就会消耗128 KiB擦除扇区,每160分钟一次。如果卡是8 GiB卡,则大约有64k个扇区,因此每20年卡都会被使用一次。如果卡耐受1000次写入循环,则可用时间为20,000年...

上述计算假定了完美的磨损平衡和非常高效的文件系统。但是,安全系数1,000应该足够。

当然,这很容易被破坏。最简单的方法之一是忘记使用noatime属性挂载磁盘。然后文件系统将更新文件访问时间,这可能导致每次访问文件(即使只读)时进行一次写操作。或者操作系统正在将虚拟内存交换到卡上。

最后一个因素也是运气。现代SD卡有不幸死亡的倾向。即使是相当知名的制造商也有很多问题。如果您杀死了一张卡,它不一定是因为达到了磨损极限。如果卡已经磨损,仍然可以读取。如果完全死亡,则是由于其他原因(静电,某个地方的小裂纹)。


感谢您抽出时间撰写如此详尽的答案。 - jsejcksn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接