36.3. 丢弃未使用块
您可以在支持它们的块设备中执行或调度丢弃操作。块丢弃操作与挂载的文件系统不再使用的文件系统块进行通信。块丢弃操作允许 SSD 优化垃圾回收例程,它们可以通知精简置备存储来重新使用未使用的物理块。
要求
基本文件系统的块设备必须支持物理的丢弃(discard)操作。
如果
/sys/block/<device>/queue/discard_max_bytes
文件中的值不为零,则支持物理丢弃操作。
36.3.1. 块丢弃操作的类型
您可以使用不同方法运行 discard 操作:
- 批量丢弃
- 由用户明确触发,并丢弃所选文件系统中所有未使用的块。
- 在线丢弃
-
在挂载时指定,并实时触发,而无需用户干预。在线丢弃操作只丢弃从
used
变为free
状态的块。 - 定期丢弃
-
是
systemd
服务定期运行的批量操作。
XFS 和 ext4 文件系统支持所有类型。
建议
红帽建议您使用批处理或周期性丢弃。
仅在以下情况下使用在线丢弃:
- 系统负载不允许使用批量丢弃,或者
- 为了保持性能,需要在线丢弃操作。
36.3.2. 执行批块丢弃
您可以执行批量块丢弃操作,以丢弃挂载的文件系统上未使用的块。
先决条件
- 挂载文件系统。
- 文件系统底层的块设备支持物理忽略操作。
流程
使用
fstrim
工具:要只在所选文件系统中执行丢弃,请使用:
# fstrim mount-point
要在所有挂载的文件系统中执行丢弃,请使用:
# fstrim --all
如果您在以下设备上执行 fstrim
命令:
- 不支持丢弃操作的设备,或者
- 由多个设备组成的逻辑设备(LVM 或者 MD),其中任意设备不支持丢弃操作:
下面的信息将显示:
# fstrim /mnt/non_discard fstrim: /mnt/non_discard: the discard operation is not supported
其他资源
-
您系统上的
fstrim (8)
手册页
36.3.3. 启用在线块丢弃
您可以执行在线块丢弃操作,以自动丢弃所有支持的文件系统上未使用的块。
流程
在挂载时启用在线丢弃:
手动挂载文件系统时,请添加
-o discard
挂载选项:# mount -o discard device mount-point
-
永久挂载文件系统时,请将
discard
选项添加到/etc/fstab
文件的挂载条目中。
其他资源
-
在您的系统中
mount (8)
和fstab (5)
手册页
36.3.4. 使用 storage
RHEL 系统角色启用在线块丢弃
您可以使用在线块丢弃选项挂载 XFS 文件系统,以自动丢弃未使用的块。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Enable online block discard ansible.builtin.include_role: name: rhel-system-roles.storage vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs mount_point: /mnt/data mount_options: discard
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证在线块丢弃选项是否已启用:
# ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'
其它资源
-
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
文件 -
/usr/share/doc/rhel-system-roles/storage/
目录
36.3.5. 启用定期块丢弃
您可以启用 systemd
计时器来定期丢弃所有支持的文件系统上未使用的块。
流程
启用并启动
systemd
计时器:# systemctl enable --now fstrim.timer Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer
/usr/lib/systemd/system/fstrim.timer.
验证
验证计时器的状态:
# systemctl status fstrim.timer fstrim.timer - Discard unused blocks once a week Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled) Active: active (waiting) since Wed 2023-05-17 13:24:41 CEST; 3min 15s ago Trigger: Mon 2023-05-22 01:20:46 CEST; 4 days left Docs: man:fstrim May 17 13:24:41 localhost.localdomain systemd[1]: Started Discard unused blocks once a week.