恢复使用过的SSD驱动器的性能并估计其使用寿命?


70

我以前的128 GB SSD驱动器现在已经大约一年半了,此后我已升级到另一个驱动器。

我想清理旧的SSD以...

  • 将其性能恢复到新的水平

  • 使其康复并通常进行健康检查

我该怎么做呢?


4
尽管它不涉及恢复,但是您可能会发现此博客帖子很有趣,可以防止这种情况的发生。
塔马拉·威斯曼

1
我可能只是想念它,但是我没有看到下面的任何答案都被“ 选中 ”。对于这个问题,我真的很好奇最终为您“最佳”工作的结果。(如果您碰巧想起了……)
不合理的约翰·

Answers:


56

在Linux上,只需运行

hdparm --trim-sector-ranges start:count /dev/sda

传递您要修剪的块范围而不是start和,count并通过SSD设备代替/dev/sda。它的优点是速度快,并且不会在驱动器上写入零。相反,它只是将TRIM命令发送到SSD控制器,让它知道您不在乎那些块中的数据,并且可以自由地假定它们在其垃圾回收算法中未使用。

您可能需要以超级用户身份运行此命令。由于此命令非常危险,因为它会立即导致主要数据丢失,因此您还需要将--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脚本(在Ubuntu 11.04上的root用户下测试)来做到这一点:

 # 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

大功告成!您可以尝试在hexedit /dev/sda之前和之后读取磁盘的原始内容,并验证驱动器是否已丢弃数据。


当然,即使您不想将Linux用作计算机的主要操作系统,也可以通过启动实时CD并在驱动器上运行它来利用此技巧。


3
写的很好,但是不幸的是,这不适用于非TRIM支持的SSD。为此,您将需要走得更远。有关如何使用hdparm的说明,请参见kernel.org上的ATA Wiki。如果您可以修改原始条目以包含此信息,那就更好了:)
James

“ fstrim”是上面的简单版本(请参阅单独的答案)。
布莱斯2015年

@布莱斯,不正确;TRIM仅是建议性的,并且出于性能原因而不是安全性的考虑,这意味着该驱动器可以像大多数驱动器一样自由地忽略命令或将擦除延迟到以后。
psusi '16

24

首先,让我们首先了解导致性能下降的原因。在不知道这一点的情况下,许多人会提出不足的解决方案(正如我已经看到的那样)。整个困境的症结基本上归结为以下事实,引自Wikipedia。记住这一点,这很重要:

对于NAND闪存,必须一次一页地执行读取和编程操作,同时解锁和擦除操作必须以块方式进行。

SSD由NAND闪存组成,而闪存则由“块”组成。每个块包含许多“页面”。为了简单起见,让我们想象一下,我们刚刚购买了一个闪亮的新SSD,其中包含一个巨大的内存块,该内存块由4个空页面组成。

为了清楚起见,我用∅,1和X区分空白页,已用页和已删除页。关键是从控制器的角度来看,每一个之间都有差异!它不像1和0那样简单。因此,首先,我们新驱动器上的页面如下所示:

∅,∅,∅,∅(全部为空)

现在,我们将一些数据写入驱动器,并且最终将其存储在该第一页中,因此:

1,∅,∅,∅

接下来,我们再写入一些数据,只是这次足够多,因此需要两页,因此最终将其存储在第二页和第三页中:

1,1,1,∅

我们的空间用完了!我们认为我们实际上并不需要我们编写的初始数据,因此请删除它以腾出空间。

X,1,1,∅

最后,我们需要存储另一组大数据,这些数据将消耗剩余的两个页面。这是没有修剪的驱动器性能命中率所在!从我们的最后一个状态转到此:

1,1,1,1

...需要比大多数人意识到的更多的工作。同样,这是由于Flash只能以逐块方式擦除,而不能逐页擦除,这正是上述最终转换所要求的。执行以下工作,TRIM和基于非TRIM的SSD之间的区别是!

由于我们需要使用一个空页面和一个已删除页面,因此SSD需要首先将整个块的内容读取到某些外部存储/内存中,擦除原始块,修改内容,然后将这些内容写回到街区。它不像“写入”那么简单,而是变成了“读取-擦除-写入”。这是一个很大的变化,在我们写入大量数据的同时发生它可能是最不适宜的时间。如果提前删除了“已删除”的页面,那将是可以避免的,而这恰恰是TRIM的目的。使用TRIM,SSD可以在删除后立即恢复我们删除的页面,也可以在TRIM算法认为合适的其他时机恢复恢复。但是重要的部分是,使用TRIM不会在我们进行写操作时发生!

如果没有TRIM,我们最终将无法避免上述情况,因为我们在驱动器中填充了数据。值得庆幸的是,一些更新的SSD不仅限于TRIM,而且在硬件级别上可以在后台有效地执行与TRIM相同的操作,而无需必要的ATA命令(有人将其称为“垃圾回收”)。但是对于我们这些不幸的人来说,两者都不是,很重要的一点是要知道,将零写入整个驱动器不足以恢复原始性能!将全零写入驱动器并不表示向控制器表明闪存中的页面可自由写入。在不支持TRIM的驱动器上执行此操作的唯一方法是使用HDDErase(通过Wayback Machine)之类的工具在驱动器上调用ATA安全擦除命令。

相信有些早期的SSD仅在删除分区或Windows 7的“ diskpart clean all”之类的东西时才支持TRIM,而不是在删除单个文件时才支持TRIM。这可能是较旧的驱动器似乎在执行该命令后恢复性能的原因。不过这对我来说似乎有点朦胧...

通常,我对SSD和硬件/小工具的大部分了解都来自anandtech.com。我以为他写了一篇很棒的文章来解释所有这些,但是对于我一生来说,我找不到它!


啊哈!我找到了原始的Anandtech文章!
詹姆斯

仅略过了这一点,但为+1提及了ATA的安全擦除,以及每块与每页的引用。
Christopher Galpin

1
尽管大多数答案是正确的,但有关垃圾回收的部分还是不正确的。所有SSD都具有垃圾回收功能。没有它,他们将无法工作。垃圾回收不能替代TRIM。在空状态下,NAND单元表示1,然后可以将其写入0。但是要使其恢复为零,必须立即擦除整个块。因此,不是覆盖现有数据,而是将任何更改写入新块,并将旧数据标记为无效。清除无效数据是垃圾收集。当您在操作系统中删除TRIM时,它会通知SSD将数据标记为无效。
阿尔法先生

不完全是阿尔法先生。术语“垃圾收集”来自控制器,它们在最佳时间主动执行您描述的过程,而不是在绝对必要时仅做出反应(这又会导致驱动器填满,从而导致性能下降)。
詹姆斯

1
也许我们永远不应该将其称为“垃圾收集”,而只是将较旧的反应式控制器称为““积者”。
詹姆斯,

17

显然,标准建议是对所有零进行全驱动器写入。我不完全确定为什么这样做有帮助(不会大量写入最终杀死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会将所有零到驱动器

如果指定all参数,则可以将每个扇区清零,并且可以删除驱动器中包含的所有数据。

完成此操作后,我可以确认磁盘性能大幅提高。


11
@Jeff最近写David Spillett解释了为什么写全零可能会有所帮助的原因:某些控制器假定可以将调零的块丢弃并返回到可用空间池,从而模拟TRIM命令的效果。
sblair 2011年

1
有2点-首先,通常Flash擦除命令将所有0xffs的块都擦除,因此最好写成0xffs。不过,我必须检查数据表才能确定。其次-如果您想使控制器愚弄TRIM来驱动器,那么运行某种只对驱动器中的每个块进行TRIM的实用工具不是一个好主意吗?就个人而言,我可能会两者都做(0xffs和TRIM),但是在这里我可能有点学究。
丹尼斯·蒙西

2
@dennis可以肯定的是,如果有这样的实用程序,请随时向我指出。
Jeff Atwood

1
@Dennis:如果驱动器使用的是“物理”“ on”位,而其他位已转换为逻辑on位,则0xff可能是您需要的模式。不过,他们可能使用的是反向逻辑,因此在进行操作之前,唯一的确定方法是与文档或与制造商的联系。我建议使用sdelete或类似方法,是尝试在工作的文件系统上修剪未使用的块。当然,这将导致对SSD映射中所有已使用和未使用的块进行非修整写入。
David Spillett

2
我有些惊讶,因为这么多人显然没有意识到安全擦除SSD的安全性。不必对每个块都进行TRIM。只需运行一个将Secure Erase ATA命令发送到SSD的实用程序,即可解决问题,而无论SSD是否支持TRIM。
詹姆斯

16

我还找到了SSD Life Pro工具。这对我来说有个坏消息。

SSDLife Pro-硬盘健康状况不佳!

至于它的计算方式,它使用SMART SSD指示器。显然,它尝试根据SMART数据进行预测

  • SSD所基于的闪存的寿命限制为每个单元10,000次写入
  • 大多数驱动器还在其SMART参数中显示有关已写入和/或已读取信息的数据

这很棘手,因为它还需要知道何时写入数据以进行估计,但这是基础数据:

01读取错误率7
09开机小时数7085
0C电源循环计数318
B8初始坏块计数15
C3程序失败块计数0
C4擦除失败块计数0
C5读取失败块计数0
C6读扇区5468243171
C7写扇区41640920876
C8读取命令100482453
C9写入命令417315851
闪存345270中的CA错误位
具有可纠正位错误的CB读取扇区340001
CC坏块满标志0
CD最大P / E计数规格5000
CE最小擦除计数3774
CF最大擦除计数65348
D0平均擦除计数4837
D1剩余驱动器寿命4

可怕的数字是剩余驱动器寿命是4 .. %!

以及计算结果:

型号:CRUCIAL_CT128M225
大小:128 GB
序列号:xxxxxxxxxxxxxxxxx456
韧体:2030
开机时间:318    
驱动器/操作系统中的TRIM支持:已启用/已启用
工作时间:9个月16天5个小时
读取的总数据:2607.46 GB
书面:19855.94 GB

作为记录,此驱动器最初是在2009年10月购买的,因此已经使用了一年半多的时间。


3
@Jeff虽然闪存的处理大小有所提高,但编程/擦除周期数量却有所减少。值0xCD表示您有一个基于34nm的驱动器,具有5,000个额定P / E周期,而不是10,000个。
sblair 2011年

1
@sblair很高兴知道;我在新的OCZ Vertex 2上试用了该工具,它具有完全不同的SMART字段和值。
杰夫·阿特伍德

2
这些数据看起来有些不对头-它表示您写入的数据几乎是读取的10倍。听起来不是很高吗?我希望阅读更多。该驱动器上是否有页面文件?
丹尼斯·蒙西

1
更多数据点-我妻子的MacBook中安装了类似的SSD。这以前是我的笔记本电脑,用于开发目的。我只是查看了该SSD的统计数据,在该驱动器使用寿命的8个月左右的时间里,它总共有17个小时的开机时间,而您需要花费7085天(295天)。我知道一个事实,即机器总共已经运行了17多个小时,但是看来操作系统正在积极关闭驱动器的电源。
丹尼斯·蒙西

2
将20TB写入128GB驱动器!您到底要将此驱动器用于什么用途?
BlueRaja-Danny Pflughoeft

6

我发现通过驱动器写入零不是最好的方法。虽然这可能会在短期内有所帮助,但我发现它绝对不能将驱动器恢复到其全部性能(我有一个相当老的未启用TRIM的Intel-SSD)。经过大约一年的大量使用后,即使将SSD置零后,当SSD尝试写入任何文件时,我也开始进入1-2秒冻结。

我发现的唯一的事情是完全恢复表现得安全擦除使用hdparm。我习惯养成每6到12个月安全擦除我的SSD的习惯,当它开始遇到一些小问题时。Macrumors上的某人制作了Mac专用教程,介绍如何针对mac *设备。

根据我所看到的所有声明,安全擦除会向SSD发送特殊命令,从而使SSD将所有扇区设置为比使用dd或使用其他方式低得多的级别为零。


如果驱动器不支持TRIM,那么所有的赌注都关闭..
杰夫·阿特伍德

1
错误的Jeff,安全擦除完全独立于TRIM。这是一个实际的ATA命令,它是您可以完全还原不支持TRIM的驱动器的唯一方法。当SSD收到此命令时,所有NAND单元均标记为空,无需进行TRIM 即可恢复驱动器的原始写入性能。有许多工具可以做到这一点,包括hdparm,到目前为止,在最上面的答案中都提到了hdparm。
詹姆斯



2

要检查(固态驱动器)ssd上剩余的ssd寿命,您将需要安装smartmontools软件包。它包含两个实用程序(smartctl和smartd),它们使用内置在大多数现代ATA和SCSI硬盘中的自我监视,分析和报告技术系统(SMART)来控制和监视存储系统。

对于基于Ubuntu,Mint或Debian的发行版

# apt-get install smartmontools

For Fedora, Centos, or Red Hat based distributions
# yum install smartmontools

您正在寻找Media_Wearout_Indicator。100表示​​您的ssd有100%的寿命,数字越小表示剩余寿命越短。

# smartctl -a /dev/sda | grep Media_Wearout_Indicator

我的笔记本电脑的输出

233 Media_Wearout_Indicator 0×0032 100 100 000 Old_age Always – 0

如果要查看驱动器的更多详细信息和完整属性,可以运行

# smartctl -data -A /dev/sda

资料来源:namhuy.net/1024/how-to-check-ssd-life-left.html


2

与@LeakyCode答案相比,对于Linux系统,现在有一个更好的答案:

须藤fstrim -v / boot

来自“ util-linx”的“ fstrim”命令将在文件系统中运行,并为所有未使用的空间发出TRIM命令。在诸如Ubuntu之类的发行版中,默认情况下将禁用此功能,但英特尔和三星的“已知安全”驱动器的选择列表除外。但是该命令可以在任何驱动器的任何分区上手动运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.