介绍
由于SSD或固态驱动器的架构,如果不考虑和减轻连续使用,则导致性能下降。 TRIM的命令是允许操作系统传播信息向下到SSD哪些数据块已不再使用的操作。 这允许SSD的内部系统更好地管理耗损均衡并为将来的写入准备设备。 TRIM可以对设备的性能随时间和其整体寿命具有重大影响。
虽然可以在Linux中启用连续TRIM,但这可能会对性能产生负面影响,因为正常文件操作会产生额外的开销。 温和的替代方法是配置周期性TRIM。 这会将操作系统配置为按计划修改驱动器,而不是常规文件操作的必要组件。 在几乎所有情况下,它提供了连续TRIM的同样的好处,而没有性能损失。
在本指南中,我们将简要讨论SSD和TRIM如何工作,然后演示如何在各种Linux发行版上启用定期TRIM。
SSD如何存储数据?
为了更好地了解TRIM解决的问题,它有助于了解SSD如何存储和管理他们的数据的一些事情。
数据单元
在SSD上的数据被写入,并在被称为页的固定大小的单元读出。 页面,反过来,在被称为块较大的单位组合在一起。
读,写和擦除限制
SSD可以单独读取和写入页面。 但是,它们只能在块级别擦除数据。 另一个限制是,写入只能在已完全零页(所有位设置为0)进行。 这意味着直接覆盖数据是不可能的。
为了修改数据,SSD实际上必须从旧位置读取信息,在存储器中修改它,然后将修改的数据写入新的零页。 然后,它更新内部表以将操作系统的逻辑位置映射到设备上数据的新物理位置。 旧的位置标记在不同的内部表作为陈旧 :不使用时,但尚未归零。
回收陈旧的页面
要回收过时的页面,SSD的内部垃圾收集进程必须从一个块中读取所有有效页面,并将它们写入一个新块。 再次,更新内部表映射逻辑和物理位置。 现在不包含唯一的仍然在使用的数据的旧块可以被归零并且被标记为准备好用于将来的写入。
TRIM做什么?
SSD的内部垃圾收集过程负责擦除块和管理耗损均衡。 然而,文件系统通常通过仅将其在自己的记录中标记为可再次使用的空间来“删除”数据。 它们实际上不会从底层存储擦除数据,但可能会覆盖以前在后续写入中由该数据占用的区域。
这意味着SSD通常不知道页面不再需要,直到它从文件系统接收到指令以稍后写入相同的逻辑位置。 它不能执行其垃圾收集例程,因为当数据被删除时不会被通知,只是当以前为它预留的空间现在应该用于其他数据时。
TRIM命令将关于不再使用的数据从文件系统下载到SSD的信息。 这允许设备在空闲时执行其常规垃圾收集任务,以便确保存在准备好处理新写入的零页。 SSD可以提前刷新数据,清理过时的页面,并且通常保持设备处于良好的工作状态。
在每次删除时执行TRIM可能是昂贵的,并且可能对驱动器的性能产生负面影响。 配置定期TRIM为设备提供关于不需要的页面的批量信息,而不是每个操作。
禁用连续TRIM
您可能已在装置上启用了设备上的连续TRIM。 在启用定期TRIM之前,了解我们当前的安装选项是很有意义的。
连续TRIM通过安装一个驱动器或分区与启用discard
选项。
首先,找到当前安装的文件系统discard
选项:
findmnt -O discard
OutputTARGET SOURCE FSTYPE OPTIONS
/mnt/data /dev/sda1 ext4 rw,relatime,discard,data=ordered
/mnt/data2 /dev/sdb1 ext4 rw,relatime,discard,data=ordered
您可以在地方重新安装这些文件系统,没有discard
选项,通过包括-o remount,nodiscard
与mount
:
sudo mount -o remount,nodiscard /mnt/data
sudo mount -o remount,nodiscard /mnt/data2
如果运行findmnt
再次命令,你不应当得到的结果:
findmnt -O discard
接下来,打开/etc/fstab
的文件,看看目前你的文件系统定义安装选项。 这些决定了每次启动时文件系统的安装方式:
sudo nano /etc/fstab
查找discard
选项,并从行中删除它,你发现:
. . .
# /dev/sda1 /mnt/data ext4 defaults,nofail,discard 0 0
/dev/sda1 /mnt/data ext4 defaults,nofail 0 0
# /dev/sdb1 /mnt/data2 ext4 defaults,nofail,discard 0 0
/dev/sdb1 /mnt/data2 ext4 defaults,nofail 0 0
保存并在完成后关闭文件。 文件系统现在将被安装而不discard
选项,并且将在后续引导此相同的方式安装。 我们现在可以为支持它的所有文件系统设置定期TRIM。
为系统分配设置定期TRIM
为使用systemd的现代发行建立定期TRIM往往是相当简单的。
Ubuntu 16.04
Ubuntu的16.04附带由每周运行脚本cron
。 这意味着启用下面部分中描述的systemd方法对于Ubuntu 16.04不是必需的。
如果你想检查脚本,你可以通过键入:
cat /etc/cron.weekly/fstrim
Output#!/bin/sh
# trim all mounted file systems which support it
/sbin/fstrim --all || true
正如你所看到的,这个脚本需要一个版本的fstrim
与--all
标志。 许多版本fstrim
随较早版本的Ubuntu不包含此选项。
其他系统分布
对于其他systemd分布,定期修剪可与启用fstrim.timer
文件,该文件将在所有能够运行TRIM操作,安装在每周一次的驱动器。 这也充分利用了fstrim --all
选项。
在写这篇文章的时候,这是以下发行版的最佳方法:
- Debian 8
- CentOS 7
- Fedora 24
- Fedora 23
- CoreOS
为CentOS 7,Fedora的23,24的Fedora和CoreOS的fstrim.service
和fstrim.timer
单位默认情况下可用。 要安排所有附加功能的驱动器的每周修剪,使.timer
单位:
sudo systemctl enable fstrim.timer
Debian 8拥有fstrim.service
和fstrim.timer
在文件系统中使用,而不能加载到systemd默认。 您只需要首先复制文件:
sudo cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system
sudo cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system
现在,您可以启用与其他发行版相同的计时器:
sudo systemctl enable fstrim.timer
您的服务器现在应该每周一次TRIM支持操作的所有已安装的文件系统。
为非系统分发设置定期TRIM
巧合的是,与非systemd初始化系统最出货的发行版还附带了版本fstrim
实用工具,不具备--all
标志。 这使得安全,自动TRIM操作更加困难。
在不支持它的驱动器上或在不正确实现它的设备上使用TRIM可能很危险,并导致数据丢失。 该--all
标志可以安全地处理这些情况,但手动试图确定连接的驱动器是否正确支持的操作可能是危险的。
在Ubuntu 14.04,短脚本调用fstrim-all
计算在内,它试图做到这一点。 通过每周执行脚本cron
执行此。 但是,脚本并不总是正确解释连接的驱动器的TRIM功能。
对于这个和其它发行fstrim
不包括命令--all
标志,最好的解决方法可能是编译的静态链接的版本fstrim
,它包括标志。 这可以安装旁边的配电管理版本,只能从显式调用cron
作业。
这可能是以下发行版的最佳选择:
- Ubuntu 14.04
- Ubuntu 12.04
- Debian 7
- CentOS 6
为Ubuntu 14.04,它可能是最好禁用fstrim-all
的运行,因为它可能无法正确检测状态脚本:
sudo chmod a-x /etc/cron.weekly/fstrim
sudo mv /etc/cron.weekly/fstrim /etc/cron.weekly/fstrim.bak
对于其他发行版,您可以直接跳转。
安装软件编译工具
首先,安装所需的软件构建工具。
对于Ubuntu和Debian系统,可以通过输入:
sudo apt-get update
sudo apt-get install build-essential
对于CentOS系统,您可以通过键入以下内容安装类似的工具集:
sudo yum groupinstall 'Development Tools'
现在,您可以编译最近的版本所需的编译依赖fstrim
。
下载并解压缩源文件
该fstrim
实用程序发布了一组中的其他工具称为util-linux
。 你可以找到源代码,通过发布版本组织, 在这里 。
点击最新版本的软件包。 此刻,即v2.28
,但作为继续发展,可能是不同的。
在下一个目录中,找到软件的最新tarball。 这将启动与util-linux-
和结束.tar.gz
。 目前,最新的稳定版本是util-linux-2.28.1.tar.gz
。 右键单击相应的链接,并将其复制到剪贴板。
回到您的服务器上,移动到/tmp
目录。 使用curl
或wget
实用程序,并粘贴网址复制到下载文件:
cd /tmp
curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.1.tar.gz
然后,解压缩tarball以创建源目录结构:
tar xzvf util-linux*
现在我们有了源代码和构建工具,我们可以构建软件。
配置和编译静态链接的fstrim
首先输入提取的目录结构:
cd /tmp/util-linux*
接下来我们需要配置软件。 因为我们只安装一个孤立fstrim
二进制,并且不希望覆盖我们的包管理系统管理的工具和库,我们将编译一个静态二进制。
为此,我们需要启用静态链接和禁用共享库。 通过键入以下属性来配置软件:
./configure --enable-static --disable-shared
一旦软件配置,你可以编译fstrim
通过打字工具:
make fstrim
这将编译该实用程序,将其放在提取的存档的顶级目录中。
二进制复制到一个目录,是不是在你的PATH。 既然我们只从调用此感兴趣cron
脚本,我们应该确保它不会与系统安装的竞争fstrim
用于其他用途。
我们将创建一个名为目录/cron-bin
,然后将二进制文件有:
sudo mkdir /cron-bin
sudo cp /tmp/util-linux*/fstrim /cron-bin
我们现在可以使用一个以上官能fstrim
效用。
创建每周Cron脚本以运行fstrim
现在,我们可以创建一个将运行新的脚本cron
每周一次。 这将是与Ubuntu 16.04中包含的完全相同的脚本,除了它将指向我们放置我们的静态编译二进制文件的位置。
通过键入以下内容创建文件:
sudo nano /etc/cron.weekly/fstrim
在里面,粘贴以下行。 这将运行我们的新fstrim
与二进制--all
选项:
#!/bin/sh
# trim all mounted file systems which support it
/cron-bin/fstrim --all || true
保存并在完成后关闭文件。
键入以下内容以使脚本可执行:
sudo chmod a+x /etc/cron.weekly/fstrim
该cron
和anacron
守护程序将运行该脚本每周一次修剪的文件系统。
结论
现在,您的Linux服务器应配置为每周定期TRIM所有支持的文件系统。 TRIM有助于最大限度地延长SSD的长期性能和使用寿命。
连续TRIM操作可能听起来很理想,但它们可以为常规文件系统操作添加显着的开销。 周期性TRIM通过中继在计划作业中执行驱动器的日常维护所需的关键信息而不是作为每个文件操作的组件来提供良好的中间环境。