Linux平台下SSD的TRIM指令的最佳使用方式(不区别对待NVMe)
SSD写数据会出现什么问题
SSD读写的单位不是位, 而是一个块。如果要改变这个块中的一位, 首先要将整个块擦写成1, 然后再写入更新的数据。
为了解决擦写块的低效, SSD的策略是将需要改写的块, 读取出来, 进行数据修改, 然后写入到新的, 已经擦除完的块中。
新的SSD, 没用的块很多, 无需擦写, 直接写入, 性能很高。随着使用量增加, 当写入时无可用块时, 则只能先擦写再写入。此时SSD性能很差。
理论上, SSD内部定期将垃圾块进行回收擦写, 但是SSD无法确认哪些数据是需要回收的。
解决问题的思路
针对SSD使用时间越长可用块变少以致于性能变差, 可以让SSD"知道"哪些块可以回收, 从而提前擦写垃圾块, 以提升性能。
那么怎么做呢? 解释这个问题需要先了解文件系统是如何"删除文件"的。
文件系统只是将文件头作一个已删除的标记, 表明文件被删除了, 即没有真正删除文件, 只是标识删除。(Linux下真正删除的时机可能是写满、ramdisk、断电等时刻, 此处不作深究)
SSD 具有一种称为 TRIM 的功能。从本质上讲, 这是一种用于回收设备上未使用的块的方法, 该块可能先前已被写入, 但不再包含有效数据, 因此可以返回到通用存储池以供重用。
TRIM就是这种"告知"SSD:"这些文件(块)已经删除了, 你可以提前擦写以提高性能!"
经过众多资料的洗礼, 我发现TRIM仿佛并非有想像中那么好, 因为开启TRIM功能后, 每次删除文件是真正的删除, SSD就可能去回收那些垃圾块, 会降低SSD的性能!
解决之法是定时TRIM, 而Systemd管理的Linux系统中都有一个命令 fstrim, 就是作TRIM操作, 可以用于普通SSD与NVMe
一次清理垃圾块的操作:(释放了这么多, 难怪满了)
sudo fstrim --fstab --verbose
Systemd管理的系统有一个专用的fstrim服务与定时器, 开启定时器方法:
#查看fstrim定时器状态
sudo systemctl status fstrim.timer
#开启fstrim定时器自启
sudo systemctl enable --now fstrim.timer
#列出timer定时器列表
sudo systemctl list-timers --all
> # sudo systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2022-02-11 06:48:30 CST; 1 months 14 days ago
Trigger: Mon 2022-04-04 00:00:00 CST; 6 days left
Triggers: ● fstrim.service
Docs: man:fstrim
Feb 11 06:48:30 ghnode systemd[1]: Started Discard unused blocks once a week.
触发时间: 周一 2022-04-04 00:00:00 CST; 还剩6天
Trigger: Mon 2022-04-04 00:00:00 CST; 6 days left
fstrim命令 -- 回收已挂载的文件系统未使用的块
fstrim 用于回收(又称为"trim")一个已挂载的文件系统上所有未使用的块; 这对于固态硬盘(SSD)和精简配置(thinly-provisioned)的存储设备比较有意义。
默认情况下, fstrim 将会回收文件系统上所有未使用的块。但是可以通过选项限定回收的范围和大小。
回收所有已挂载文件系统上的未使用空间(包含所有支持"trim"的设备):
> # fstrim -a
设置文件系统上搜索空闲块的起点, 也就是仅搜索该点之后的空间:
> # fstrim -o 512
设置搜索长度, 也就是从起点开始, 在多大范围内搜索空闲块:
> # fstrim -l 512
啰嗦模式, 输出回收过程中的详细信息:
> # fstrim -v
fstrim 能自动判断硬盘是否支持回收操作, 如: 机械硬盘和其他外挂盘
sudo /sbin/fstrim -v /miner
fstrim: /miner: the discard operation is not supported
参考资料:
https://www.cnblogs.com/hellxz/p/13367925.html
常见的问题:
ghnode kernel: [7751636.907288] nvme nvme1: I/O 493 QID 8 timeout, completion polled
你这个有可能是写入操作较多, 触发了trim操作。
看下你的/etc/fstab中那个分区的挂载参数, 如果没有discard, 就加上去。或者你时不时手动运行fstrim一下。
/dev/sda1 / ext4 noatime,discard,defaults
sudo /sbin/fstrim -v /
discard
若 SSD 支持 TRIM 命令, 可以在 /etc/fstab 中启用 discard 参数。建议将 discard 挂载参数作为首选。
该参数不是必需的, 可以自定义周期性运行 fstrim 命令来取代该参数, 使用该命令前要确认 SSD 支持 TRIM, 否则可能造成数据丢失。
当 SSD 有足够的空余空间或(未分配的)可用空间时不需要该参数。
1) uname -a Linux内核自2.6.33开始支持TRIM。
2) hdparm -I /dev/sda | grep TRIM 显示 * Data Set Management TRIM supported 说明 SSD 支持trim
3) /etc/fstab 修改 /dev/sda1 / ext4 defaults 为 /dev/sda1 / ext4 discard,defaults 然后执行 mount 查看是否含有 discard
本文暂时没有评论,来添加一个吧(●'◡'●)