网站搜索

SSD 在 Linux 中非常慢。如何在 Linux 中检查并启用 TRIM(已解决)


如果您的SSD最初表现出高性能,但随着时间的推移,读写数据的速度明显变慢,或者周期性地SSD的读写速度急剧下降,那么这篇文章可以帮助您。

对于SSD驱动器,需要执行Trim操作,并且在某些Linux发行版上默认不启用

固态硬盘(SSD)的运行和信息存储原理与硬盘(HDD)有很大不同。

简而言之,删除文件时,字节实际上并没有被删除,而是在文件系统日志中记录了以前被该文件占用的磁盘某些区域现在是空闲的,并且可以在必要时被覆盖。对于 SSD 和 HDD 来说都是如此。对于每个磁盘驱动器,这都会产生不同的后果。

对于 HDD,这意味着通常可以恢复被视为已删除的文件。对于传统硬盘来说,写入标记为已删除的文件所在的磁盘部分与写入未占用的扇区没有什么不同。

SSD 将数据存储在闪存单元中,这些单元被分组(在 MLC 中)为“页”(通常每个 4 KB),而“页”又被分组为块(通常为 128 页或总共 512 KB)。 NAND闪存单元只有在干净的情况下才能直接写入。当它们存储数据时,必须先擦除单元格的内容,然后才能将新数据写入其中。在SSD中,写操作只能在页上执行,但由于硬件限制,擦除命令总是在整个块上执行。因此,只要有干净的页面,写入 SSD 的速度就非常快,但如果需要擦除之前写入的页面,写入速度就会显着减慢。由于页面中的单元必须先清除才能再次写入,但只能清除整个块,因此重写过程会启动读取-清除-修改-写入循环:整个块的内容必须存储在在将它们从驱动器中逐出之前,先将其写入高速缓存,然后在高速缓存中修改要重写的数据,然后将整个块(包含更新的页面)写入驱动器。这种现象称为写入放大 (WA)。

基本上,您需要提前告诉 SSD 哪些单元不再使用,以便驱动器可以清除它们并为下一次写入做好准备。如果驱动器尚未为此做好准备,则驱动器将在写入任何内容之前清除未使用的单元,这将延迟写入。

这就是 Trim 的用途——它告诉驱动器哪些单元实际上未使用,以便驱动器可以提前清除它们并为下一次写入做好准备。

修剪命令(在 ATA 命令集中称为 TRIM,在 SCSI 命令集中称为 UNMAP)允许操作系统通知固态驱动器 (SSD) 哪些数据块不再被视为“正在使用”,并且因此可以在内部擦除。

另请参阅:

  • https://en.wikipedia.org/wiki/Trim_(计算)

如何在Linux中启用TRIM

默认情况下,大多数 Linux 发行版中已启用 TRIM。

但是,首先,在某些发行版中,您需要自己启用此服务(例如,在 Arch Linux 中,它是由用户从头开始安装和配置的)。

其次,您可能想要更改 TRIM 命令频率的设置。默认情况下,TRIM 操作每周自动执行一次。如果您的 SSD 几乎完全被占用(几乎没有可用空间)并且您主动向其中写入和删除文件,那么可能需要更频繁地对该磁盘运行 TRIM 命令。

如何在Linux中启用自动TRIM

首先,检查 fstrim.timer 的状态,为此,请运行以下命令:


systemctl status fstrim.timer

如果您看到状态


Active: active (waiting)

这意味着fstrim服务已经被添加到自动启动中。

完整输出:


● fstrim.timer - Discard unused filesystem blocks once a week
     Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; preset: disabled)
     Active: active (waiting) since Fri 2024-08-09 10:39:52 +07; 1h 41min ago
 Invocation: c27c5ed11be644d79d071cba5033719b
    Trigger: Mon 2024-08-12 00:56:05 +07; 2 days left
   Triggers: ● fstrim.service
       Docs: man:fstrim

Aug 09 10:39:52 HackWare systemd[1]: Started Discard unused filesystem blocks once a week.

在此输出中,您可以看到激活 TRIM 的触发器将于 2024-08-12 触发,距离触发还剩 2 天。

如果您看到 fstrim.timer 的状态为非活动状态:


Active: inactive (dead)

然后你可以使用以下命令在Linux中启用自动TRIM:


sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer

如果要在 Linux 中编辑 TRIM 频率,请使用以下命令:


sudo systemctl edit fstrim.timer

如何手动执行TRIM

您可以随时对特定磁盘或所有已挂载的文件系统(仅支持已挂载的文件系统)手动执行 TRIM。


sudo fstrim -v MOUNTPOINT

这里,您需要指定挂载点,而不是MOUNTPOINT,例如,对作为文件系统根分区的磁盘执行TRIM:


sudo fstrim -v /

输出示例:


/: 628 GiB (674344615936 bytes) trimmed

也就是说,通过 TRIM 操作,为后续的快速写入准备了 628 GiB(占整个磁盘的 70%,难怪写入速度会下降)。

以下命令将对安装在 /mnt/disk_d/ 的磁盘执行 TRIM:


sudo fstrim -v /mnt/disk_d/

示例输出:


/mnt/disk_d/: 425.1 GiB (456420438016 bytes) trimmed

TRIM 完成所需的时间取决于正在处理的数据量。如果要 TRIM 的大小为数百 GB,则该操作可能需要几分钟。如果没有要 TRIM 的新数据,再次运行 TRIM 将更快地完成。

您可以选择以下选项之一,而不是指定安装点。

-a (--all) 选项表示对所有已挂载的文件系统执行 TRIM。

例子 :


sudo fstrim -v -a

选项-A--fstab)表示对/etc/fstab中提到的所有已挂载的文件系统执行TRIM。

例子 :


sudo fstrim -v -A

不支持 TRIM 的磁盘将被自动跳过。

TRIM已启用,但SSD仍然很慢

如果 TRIM 操作不能解决您的问题,请尝试以下选项:

1. 更新磁盘固件。

2. 检查磁盘的运行状况(使用制造商实用程序或 Linux 实用程序)。

3. 确保磁盘没有过热。