Linux下怎么启用SSDTRIM功能

这篇文章主要介绍“Linux 下怎么启用 SSD TRIM 功能”,在日常操作中,相信很多人在Linux 下怎么启用 SSD TRIM 功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux 下怎么启用 SSD TRIM 功能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联公司服务项目包括方城网站建设、方城网站制作、方城网页制作以及方城网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,方城网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到方城省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

之前知道 SSD 有 TRIM 的功能,但一直没有深究,直到最近同事问起。目前了解的信息如下,如有错误,欢迎指正。

SSD 在闪存单元中存取数据时有 page 和 block 的概念。SSD 被划分成很多 block, 而 block 被划分成很多 page。

Linux 下怎么启用 SSD TRIM 功能

SSD Read 和 Write 都以 page 为单位,而清除数据(Erase) 是以 block 为单位的。不过 SSD 的 Write 只能写到空的 page 上,不能像传统机械磁盘那样直接覆盖,修改数据时,操作流程为 read-modify-write:读取原有 page 的内容,在 cache 中修改,写入新的空的 page 中,修改逻辑地址到新的 page ,原有 page 标记为 'stale',并没有清零。

Linux 文件系统对于删除操作,只标记为未使用,实际并没有清零,底层存储如 SSD 和传统机械磁盘并不知道哪些数据块可用,哪些数据块可以 Erase。所以对于非空的 page,SSD 在写入前必须先进行一次 Erase,则写入过程为 read-erase-modify-write: 将整个 block 的内容读取到 cache 中,整个 block 从 SSD 中 Erase, 要覆写的 page 写入到 cache 的 block 中,将 cache 中更新的 block 写入闪存介质,这个现象称之为写入放大( write amplification)。

为了解决这个问题,SSD 开始支持 TRIM,TRIM 功能使操作系统得以通知 SSD 哪些页不再包含有效的数据。TRIM 功能有助于延长 SSD 的长期性能和使用寿命。如果要启用 TRIM, 需要确认 SSD 、操作系统、文件系统都支持 TRIM。

根据 RedHat 的 SOLID-STATE DISK DEPLOYMENT GUIDELINES 介绍:随着所使用的 block 接近磁盘容量, SSD 的性能会开始降低,性能影响程度因供应商而异,但是所有设备都会遇到一些性能下降。为了解决性能退化问题,Linux 操作系统支持发送 discard 请求来通知存储器哪些 block 不再使用。

检测 SSD 是否支持 TRIM

可以通过 /sys/block 下的信息来判断 SSD 支持 TRIM, discard_granularity 非 0 表示支持。

# cat /sys/block/sda/queue/discard_granularity0# cat /sys/block/nvme0n1/queue/discard_granularity512

也可以直接使用 lsblk 来检测,DISC-GRAN (discard granularity) 和 DISC-MAX (discard max bytes) 列非 0 表示该 SSD 支持 TRIM 功能。

# lsblk --discardNAME    DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda            0        0B       0B         0├─sda1         0        0B       0B         0├─sda2         0        0B       0B         0└─sda3         0        0B       0B         0sr0            0        0B       0B         0nvme0n1      512      512B       2T         1nvme1n1      512      512B       2T         1

网上也有文章介绍通过 hdparm 来检测,不过我在 Intel P4500 SSD 测试没有返回该信息。

# hdparm -I /dev/sda | grep TRIM*    Data Set Management TRIM supported (limit 1 block)

Continuous TRIM

RedHat Enterprise Linux 6.3 和之前版本,只有 ext4 文件系统完全支持 discard。 RedHat Enterprise Linux 6.4 开始,ext4 和 XFS 已经完全支持 discard。

对于 ext4 文件系统,可以在/etc/fstab里添加 discard 参数来启用 TRIM,添加前请确认你的 SSD 支持 TRIM。

/dev/sdb1  /data1       ext4   defaults,noatime,discard   0  0

以下是 ext4 文档中的挂载参数介绍:

discard

nodiscard(*)

Controls whether ext4 should issue discard/TRIM. commands to the underlying block device when blocks are freed.

Periodic TRIM

util-linux 中自带了 fstrim 工具(Discard unused blocks on a mounted filesystem.),平常用 -a 选项(-a, --all trim all mounted filesystems that are supported)比较多,可以自动检测硬盘是否支持 trim 功能,并在已挂载文件系统上执行 trim。

有兴趣的同学可以看 fstrim 源码 具体实现。

以下是我在 CentOS 7.4 系统做的测试,/dev/nvme0n1 和 /dev/nvme1n1 是 Intel P4500 NVMe SSD, 文件系统为 ext4。

# fstrim -a -v/data2:3.4 TiB (3710506934272 字节) 已修剪
/data1:3.2 TiB (3546946879488 字节) 已修剪# df -h文件系统        容量  已用  可用 已用% 挂载点
/dev/sda2       267G  7.0G  246G    3% /
devtmpfs         63G     0   63G    0% /dev
tmpfs            63G     0   63G    0% /dev/shm
tmpfs            63G  1.1G   62G    2% /run
tmpfs            63G     0   63G    0% /sys/fs/cgroup
/dev/sda1       190M  147M   29M   84% /boot
/dev/nvme0n1    3.6T  365G  3.1T   11% /data1
/dev/nvme1n1    3.6T  212G  3.2T    7% /data2
tmpfs            13G     0   13G    0% /run/user/1000

fstrim 过程中,磁盘 IO 使用率还是比较高的, 两块盘加起来用了 2 分钟。

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme0n1           0.00   319.00  592.00  716.00  2368.00 76391672.00 116810.46     1.10    0.84    0.20    1.37   0.74  97.40
nvme1n1           0.00     0.00    0.00    6.00     0.00    24.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
sda               0.00     9.00    0.00    2.00     0.00    44.00    44.00     0.00    0.00    0.00    0.00   0.00   0.00

在使用 systemd 的 Linux 发行版中,一般都自带了 fstrim.timer 和 fstrim.service,启用后会定期一周执行一次 fstrim。以下是 CentOS 7.4 中的 service 文件。

# systemctl enable fstrim.timer# systemctl start fstrim.timer# cat /usr/lib/systemd/system/fstrim.timer[Unit]Description=Discard unused blocks once a weekDocumentation=man:fstrim[Timer]OnCalendar=weeklyAccuracySec=1hPersistent=true[Install]WantedBy=multi-user.target# cat /usr/lib/systemd/system/fstrim.service[Unit]Description=Discard unused blocks[Service]Type=oneshotExecStart=/usr/sbin/fstrim -a

参考

Arch Wiki: Solid State Drive

How to properly activate TRIM for your SSD on Linux: fstrim, lvm and dm-crypt

How To Configure Periodic TRIM for SSD Storage on Linux Servers

优化永久性磁盘和本地 SSD 的性能

从 Intel 工程师那边了解到,Intel Optane SSD 不同于 NAND, 使用了 write-in-place 技术, 没有垃圾回收,没有 trim。而 Intel P4500、P4600 系列的 NVMe SSD 都是 NAND 产品,主动 trim 可以优化性能并延长寿命。

到此,关于“Linux 下怎么启用 SSD TRIM 功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


当前文章:Linux下怎么启用SSDTRIM功能
文章分享:http://myzitong.com/article/jsjsds.html