fstrim 重启后修剪所有可用空间

fstrim 重启后修剪所有可用空间

我刚刚升级到固态硬盘。性能非常好。

但是,每次重启后,当我对分区执行 fstrim 时,它会修剪所有可用空间。据我所知,修剪会写入所有可用的可用空间。不确定是否相关,但我使用全盘加密(包括 /boot)。

由于频繁写入会大大缩短 SSD 的寿命,因此我对这种修剪感到担心。

以下是我每次修剪时保存的日志:

Jul 30 13:46:00 /: 478.6 MiB (501862400 bytes) trimmed
Jul 31 13:22:26 /: 347.8 GiB (373409230848 bytes) trimmed
Jul 31 13:25:32 /: 194.3 MiB (203710464 bytes) trimmed
Jul 31 13:25:40 /: 19.2 MiB (20111360 bytes) trimmed
Aug 02 14:08:06 /: 345.9 GiB (371398463488 bytes) trimmed
Aug 02 22:21:36 /: 56.9 GiB (61047971840 bytes) trimmed
Aug 02 22:31:27 /: 347.7 MiB (364560384 bytes) trimmed
Aug 02 22:31:43 /: 127 MiB (133144576 bytes) trimmed
Aug 02 22:33:01 /: 243 MiB (254767104 bytes) trimmed
Aug 03 06:58:47 /: 1 GiB (1080602624 bytes) trimmed
Aug 03 10:00:02 /: 2.4 GiB (2526216192 bytes) trimmed
Aug 03 11:42:14 /: 341 GiB (366146318336 bytes) trimmed
Aug 03 16:00:01 /: 0 B (0 bytes) trimmed
Aug 03 16:33:53 /: 0 B (0 bytes) trimmed
Aug 03 16:48:43 /: 341 GiB (366074740736 bytes) trimmed
Aug 03 16:50:13 /: 1.2 GiB (1297809408 bytes) trimmed
Aug 03 16:53:31 /: 341 GiB (366074695680 bytes) trimmed
Aug 03 17:07:55 /: 340.9 GiB (366066126848 bytes) trimmed
Aug 05 22:00:13 /: 341 GiB (366073069568 bytes) trimmed
Aug 05 22:07:22 /: 1.2 GiB (1261793280 bytes) trimmed
Aug 06 07:41:50 /: 1.4 GiB (1522991104 bytes) trimmed
Aug 06 10:00:11 /: 341 GiB (366068740096 bytes) trimmed

可以看到,电脑开机后的裁剪大概是~340GiB,而正常使用时的裁剪只有1GiB左右。

我是否应该担心这会磨损我的 SSD?我是否不应该修剪?

答案1

有一个误解。修剪不会导致额外的写入,它减少他们。

SSD(更确切地说是 NAND)有两种“块”概念,其中一个实际上称为堵塞(通常是 128k 到 512k),另一个更接近于你在文件系统中所说的“块”的意思,叫做(通常约为 4k)。您可以每次输出一页完整的页面,就像在旧硬盘上一样,没有问题。一切按预期进行。

但是你不能覆写页面,它们是一次写入的。此后,您只能擦除使其再次可写入。这才是 NAND 寿命的计算依据。问题是……实际上你不能擦除页面。您只能擦除(即每次有 32-64 页的集群)。

这意味着当您覆盖页面(文件系统中的“块”)时,控制器必须:

  1. 读入完整的块
  2. 如果存在“原始”或已擦除的块,则使用该块
  3. 否则清除同一个区块
  4. 写出完整的块,并相应地修改被覆盖页面的内容
  5. 做一些未指定的“魔法”,使擦除周期均匀分布在所有块上,防止过早死亡

这有点简单化了,但原理就是这样的。聪明的控制器可能会做一些略有不同的事情(例如,逻辑上重新映射页面,填充所有页面直到没有剩余页面,并以某种方式“记住”哪些是好的,哪些是陈旧的,等等),但原则上工作流程如上所述。

这是一个问题,因为小块写入很常见,所以很快你的磁盘上的每个块都至少被写入过一次。现在控制器能做什么?没什么。它真的不知道文件系统在做什么或预期做什么,所以它必须以最保守的假设为基础。也就是说,曾经写入的所有内容都必须保留。

TRIM 解决了这个问题。它告诉控制器,这样或那样大的范围未被使用,因此控制器也可以丢弃它。它不会写入任何内容。如果有的话,它只会擦除块(但只擦除一次,而不是每次)。
由于您告诉控制器您不使用该数据,因此它可以冒险将其丢弃而不会造成任何损害。现在突然又有可写的块可用,而无需复制数据并反复擦除块。这不仅使写入快点而且还减少了必须发生的擦除次数。

答案2

fstrim似乎释放全部分区的可用空间,而不仅仅是自上次调用以来释放的空间fstrim。另请参阅这篇文章

相关内容