我的旧 128 GB SSD 硬盘已使用约一年半了,现已升级到另一个硬盘。
我想清理我的旧 SSD 以便...
将其性能恢复到接近新的水平
修复它并进行健康检查
我该如何做呢?
答案1
在 Linux 上,只需运行
hdparm --trim-sector-ranges start:count /dev/sda
传递要 TRIM 的块范围而不是 和 ,start
以及count
SSD 设备代替/dev/sda
。它的优点是速度快,并且不会在驱动器上写入零。相反,它只是向 SSD 控制器发送 TRIM 命令,让它知道您不关心这些块中的数据,它可以自由地假设它们在其垃圾收集算法中未使用。
您可能需要以 root 身份运行此命令。由于此命令极其危险,因为它可能立即导致大量数据丢失,因此您还需要传递--please-destroy-my-drive
参数hdparm
(我没有将其添加到命令行以防止复制和粘贴导致意外数据丢失。)
在上面的命令行中,/dev/sda
应将其替换为您要向其发送 TRIM 命令的 SSD 设备。start
是要 TRIM 的第一个块(扇区)的地址,是count
从该起始地址标记为空闲的块数。您可以将多个范围传递给该命令。
我亲自在装有 128GB Crucial RealSSD C300 的笔记本电脑上使用 Ubuntu 11.04 上的 hdparm v9.32 完成此操作后,必须指出一个问题:我无法将磁盘块总数 (0:250069680) 作为范围传递。我手动(本质上是手动“二进制搜索”)找到了一个足够大的块计数值(40000),并且能够对 40000 个范围的序列发出 TRIM 命令以释放整个磁盘。可以使用如下简单的 shell 脚本执行此操作(在 root 下的 Ubuntu 11.04 上测试):
# fdisk -lu /dev/sda
Disk /dev/sda: 128.0 GB, 128035676160 bytes
255 heads, 63 sectors/track, 15566 cylinders, total 250069680 sectors
...
要擦除整个驱动器,请获取该扇区总数并将下一行中的 250069680 替换为该数字并运行(添加--please-destroy-my-drive
):
# i=0; while [ $i -lt 250069680 ]; do echo $i:40000; i=$(((i+40000))); done \
| hdparm --trim-sector-ranges-stdin /dev/sda
您已完成!您可以尝试使用 before 和 after 读取磁盘的原始内容hexedit /dev/sda
,并验证驱动器是否已丢弃数据。
当然,即使您不想使用 Linux 作为机器的主要操作系统,您也可以通过启动实时 CD 并在驱动器上运行它来利用此技巧。
答案2
首先,让我们先了解一下到底是什么导致了性能下降。如果不知道这一点,许多人会提出不充分的解决方案(我已经看到这种情况了)。整个困境的关键基本上可以归结为以下事实,引自维基百科。记住它,这很重要:
对于 NAND 闪存,读取和编程操作必须一次一页地执行,而解锁和擦除必须以逐块的方式进行。
SSD 由 NAND 闪存组成,而闪存由“块”组成。每个块包含许多“页面”。为了简单起见,假设我们刚购买了一个崭新的 SSD,其中包含一个巨大的内存块,该块由 4 个空页面组成。
为了清楚起见,我用 ∅、1 和 X 来区分空白页、已使用页和已删除页。关键在于从控制器的角度来看,它们之间是有区别的!它并不像 1 和 0 那么简单。因此,首先,我们新驱动器上的页面如下所示:
∅、∅、∅、∅(全为空)
现在,我们将一些数据写入驱动器,最终这些数据会存储在第一页中,因此:
1、∅、∅、∅
接下来,我们写入更多数据,但这次需要两页,因此最终存储在第 2 页和第 3 页中:
1,1,1,∅
空间不够了!我们决定不再需要我们写入的初始数据,因此删除它以腾出空间。:
X,1,1,∅
最后,我们还有另一组需要存储的大量数据,这将占用剩下的两页。这就是在没有修剪的驱动器中性能受到影响的地方!!从上一个状态到这个状态:
1,1,1,1
...需要的工作比大多数人意识到的要多。这也是因为闪存只能以块为单位擦除,而不能以页面为单位擦除,而这正是上述最后转换所要求的。基于 TRIM 和非 TRIM 的 SSD 之间的区别在于什么时候进行以下工作!
由于我们需要利用空白页和已删除页,因此 SSD 需要首先将整个块的内容读入某个外部存储器/内存,擦除原始块,修改内容,然后将这些内容写回到块中。它不再像“写入”那么简单,而是变成了“读取-擦除-写入”。这是一个很大的变化,而且在我们写入大量数据时发生这种情况可能是最不合适的时间。如果提前恢复“已删除”的页面,就可以避免这种情况,这正是 TRIM 的目的。使用 TRIM,SSD 可以在删除后立即恢复我们已删除的页面,或者在 TRIM 算法认为合适的其他适当时间恢复。但重要的是,使用 TRIM 时,这种情况不会发生在我们正在写入的过程中!
如果没有 TRIM,我们最终无法避免上述情况,因为我们的驱动器中充满了数据。幸运的是,一些较新的 SSD 不仅仅具有 TRIM,而且在硬件层面上有效地在后台执行与 TRIM 相同的操作,而无需必要的 ATA 命令(有些人称之为垃圾收集)。但对于我们这些不幸两者都没有的人来说,重要的是要知道将整个驱动器写入零不足以恢复原始性能!!!!!将全零写入驱动器并不向控制器表明闪存中的页面可以写入。在不支持 TRIM 的驱动器上执行此操作的唯一方法是使用以下工具在驱动器上调用 ATA 安全擦除命令:HDDErase(来自 Wayback Machine)。
我相信有些早期的 SSD 仅在删除分区或执行 Windows 7 的“diskpart clean all”等操作时才支持 TRIM,而在删除单个文件时则不支持。这可能是旧驱动器在执行该命令后似乎恢复性能的原因。不过这对我来说似乎有点模糊……
我对 SSD 和硬件/小工具的了解大多来自anandtech.com。我以为他有一篇很棒的文章来解释这一切,但我无论如何也找不到它!
答案3
显然,标准建议是将整个驱动器全部写入零。我不完全确定为什么这会有所帮助(大量的写入最终不会杀死SSD吗?),但它似乎得到了主要供应商SSD支持论坛的认可。
因此,要在 Windows 中执行此操作:
- 使用管理员权限启动命令提示符
- 执行命令
diskpart
进入实用程序后,您将看到DISKPART>
提示并发出以下命令:
DISKPART> list disk
DISKPART> select disk x
明显地,确保您选择了正确的 SSD 驱动器然后再继续!
DISKPART> clean all
DISKPART> create partition primary
DISKPART> format quick fs=NTFS
这里的魔力clean all
在于将所有零写入驱动器:
如果指定全部参数,则可以将每个扇区清零,并删除驱动器上包含的所有数据。
完成此操作后,我可以确认磁盘性能大幅提高。
答案4
我发现通过驱动器写入零并不是最好的方法。虽然它可能在短期内有所帮助,但我发现它绝对没有恢复我的驱动器的全部性能(我有一块相当老的未启用 TRIM 的 Intel-SSD)。经过一年左右的相当频繁的使用后,当 SSD 尝试写入时,我开始遇到 1-2 秒的冻结任何即使在将 SSD 归零之后也是如此。
我发现唯一能完全恢复性能的是一个安全擦除使用hdparm
。我养成了每 6-12 个月对 SSD 进行安全擦除的习惯,当 SSD 开始出现一些小问题时。Macrumors 上有人专门为 Mac 做了一个教程关于如何针对 mac* 设备进行操作。
根据我所看到的所有说法,安全擦除会向 SSD 发送一个特殊命令,使其将所有扇区设置为零,并且设置水平要比仅仅使用dd
或其他方式低得多。