Storm Asked: 2018-02-13 04:26:04 +0800 CST2018-02-13 04:26:04 +0800 CST 2018-02-13 04:26:04 +0800 CST BtrFS 快照会杀死我的 SSD 吗? 772 据我所知,BtrFS 快照实际上并不复制数据。我想,每次更改快照数据时都会执行实际复制。 那么,启用快照的 SSD 上的 BtrFS 分区是否会使 SSD 内存的磨损加倍?一次写入新数据,第二次写入将差异记录到快照。 我已经使用带有快照的/BtrFS 作为分区的文件系统已经有相当长的一段时间了,而且有好几次它确实对我有帮助。但现在我要在 SSD 上安装系统。 btrfs ssd 1 个回答 Voted Best Answer Austin Hemmelgarn 2018-02-13T12:12:22+08:002018-02-13T12:12:22+08:00 TL;博士 不,它不会减少 SSD 的寿命,就像使用没有快照的 BTRFS 一样。 解释 有几种不同的方法可以在软件中实现快照: 您存储所有被快照的数据的精确副本。这不是很有效(在空间和时间方面),但它是存储数据真实历史副本的唯一选项,并且实现起来非常简单。由于效率问题,它没有广泛用于快照,但这本质上是卷的完整备份。 您存储数据的当前状态和历史状态之间差异的副本。此方法在读取数据时存在性能问题,因为系统必须在请求的时间计算请求数据的状态。这可以通过以下两种方式之一进行分层: 一个。每个快照存储数据的当前状态与拍摄快照时数据的状态之间的差异。这是节省空间的,但不节省时间(因为写出更改的时间与快照数量成线性关系)。快照的读取性能很差,但对于当前数据来说还不错。这种方法并没有被广泛使用,因为它实现起来有些棘手,而且写入性能非常糟糕,你还不如只存储一个完整的副本。 湾。拍摄的第一个快照存档了当时数据的状态,随后的快照仅存储自该副本以来的差异,当前状态是一种特殊情况,会随着用户更新而改变。如果您只修改现有数据而不添加或删除任何数据,这只会节省空间,但比 2a 更节省时间。大多数快照和当前数据的读取性能都很差,但对于第一个快照来说还不错。这就是增量备份的工作方式,并且在一个特殊的安排中,每个差异都与以前的版本是版本控制软件所做的,但它并没有被广泛用于快照,因为下一个选项几乎在所有方面都更好。 快照是通过写时复制 (COW) 语义实现的。这是最节省空间的选项,并且平均比方法 2 的两种变体更节省时间。使用 COW 快照,任何给定的数据都存储一次,并且包含该数据的每个快照都会引用它。这解决了选项 1 和 2 的大部分问题。也有两种方法可以处理 COW 快照: 一个。当当前版本中给定的一条数据发生变化时,将旧数据复制到快照中,然后更新新数据。这会导致在拍摄快照后对某个位置的第一次写入出现性能问题,但随后的写入很好,并且性能在其他方面是合理的。这就是 LVM 实现快照的方式,因为它很容易附加到尚未使用 COW 语义的现有数据集。 湾。当当前版本中的给定数据发生更改时,在当前版本中创建该位置的新副本并将更改的数据存储在那里。这避免了选项 3a 的首次写入性能问题,但在删除快照时会导致性能损失(因为您必须验证每一位数据的引用以确定是否可以删除它)。这就是 ZFS 和 BTRFS 实现快照的方式(尽管 BTRFS 在某些非常特殊的情况下使用方法 3a)。 因为 BTRFS 使用方法 3b,在处理元数据时使用快照唯一增加的开销,这应该占 BTRFS 写入的实际数据的很小百分比(并且元数据更新无论如何都会发生,它们只是稍微小一点,没有快照)。
TL;博士
不,它不会减少 SSD 的寿命,就像使用没有快照的 BTRFS 一样。
解释
有几种不同的方法可以在软件中实现快照:
您存储所有被快照的数据的精确副本。这不是很有效(在空间和时间方面),但它是存储数据真实历史副本的唯一选项,并且实现起来非常简单。由于效率问题,它没有广泛用于快照,但这本质上是卷的完整备份。
您存储数据的当前状态和历史状态之间差异的副本。此方法在读取数据时存在性能问题,因为系统必须在请求的时间计算请求数据的状态。这可以通过以下两种方式之一进行分层:
一个。每个快照存储数据的当前状态与拍摄快照时数据的状态之间的差异。这是节省空间的,但不节省时间(因为写出更改的时间与快照数量成线性关系)。快照的读取性能很差,但对于当前数据来说还不错。这种方法并没有被广泛使用,因为它实现起来有些棘手,而且写入性能非常糟糕,你还不如只存储一个完整的副本。
湾。拍摄的第一个快照存档了当时数据的状态,随后的快照仅存储自该副本以来的差异,当前状态是一种特殊情况,会随着用户更新而改变。如果您只修改现有数据而不添加或删除任何数据,这只会节省空间,但比 2a 更节省时间。大多数快照和当前数据的读取性能都很差,但对于第一个快照来说还不错。这就是增量备份的工作方式,并且在一个特殊的安排中,每个差异都与以前的版本是版本控制软件所做的,但它并没有被广泛用于快照,因为下一个选项几乎在所有方面都更好。
快照是通过写时复制 (COW) 语义实现的。这是最节省空间的选项,并且平均比方法 2 的两种变体更节省时间。使用 COW 快照,任何给定的数据都存储一次,并且包含该数据的每个快照都会引用它。这解决了选项 1 和 2 的大部分问题。也有两种方法可以处理 COW 快照:
一个。当当前版本中给定的一条数据发生变化时,将旧数据复制到快照中,然后更新新数据。这会导致在拍摄快照后对某个位置的第一次写入出现性能问题,但随后的写入很好,并且性能在其他方面是合理的。这就是 LVM 实现快照的方式,因为它很容易附加到尚未使用 COW 语义的现有数据集。
湾。当当前版本中的给定数据发生更改时,在当前版本中创建该位置的新副本并将更改的数据存储在那里。这避免了选项 3a 的首次写入性能问题,但在删除快照时会导致性能损失(因为您必须验证每一位数据的引用以确定是否可以删除它)。这就是 ZFS 和 BTRFS 实现快照的方式(尽管 BTRFS 在某些非常特殊的情况下使用方法 3a)。
因为 BTRFS 使用方法 3b,在处理元数据时使用快照唯一增加的开销,这应该占 BTRFS 写入的实际数据的很小百分比(并且元数据更新无论如何都会发生,它们只是稍微小一点,没有快照)。