抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

TRIM 是 SSD 进行回收硬盘上未使用的块的方法,该块可能先前已被写入,但不再包含有效数据,因此可以返回到通用存储池以供重用。
对于 PVE 管理的虚拟磁盘,则需要进行相关设置才能正常触发。

实验环境

PVE 8.2.7

背景:虚拟磁盘空间占用

今天发现有台 Ubuntu22.04 的虚拟机,虚拟磁盘占用要比系统内实际使用多得多。

如下图:其 disk size 为 105GB。

Snipaste_2024-12-29_15-19-33

SSH 连接看一下系统内实际占用:

1
2
3
4
5
6
7
8
╭─dsf@jump-server ~ 
╰─$ df -h
文件系统 大小 已用 可用 已用% 挂载点
tmpfs 392M 2.1M 390M 1% /run
/dev/sda2 147G 36G 104G 26% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 392M 4.0K 392M 1% /run/user/1000

可以知道实际使用的空间大小约为 37G。

此虚拟机使用基于目录的后端存储,虚拟磁盘存储在 PVE 本机磁盘(一块 NVMe SSD)。

基本原理

为什么要对 SSD 进行 TRIM 呢?

维基百科

Trim(意为修整、修剪、裁剪)使 SSD 能更有效地完成垃圾收集的工作,而不用牺牲对存储块的写入速度。

目前市面上出售的消费级、企业级 SSD 都是支持 TRIM 功能,如下图 ZHITAI P7100:

Snipaste_2024-12-29_15-37-03

检索 PVE 官方文档得知,在虚拟磁盘满足以下要求,且对虚拟磁盘进行额外设置才能触发 Guest 的磁盘 TRIM。

Shrink Qcow2 Disk Files

Requirements:

  • Thin-provisioned backing storage (qcow2 disk, thin-lvm, zfs, …)
  • Virtio-SCSI controller configured on guest.
  • Guest scsi disks with the discard option enabled

HOST 设置

在 PVE 的 WebUI 对.qcow2格式的虚拟磁盘开启丢弃功能即可(如果是 SSD 建议勾选SSD仿真IO thread),变更设置后需要重启虚拟机才能生效。

Snipaste_2024-12-29_14-29-05

GUEST TRIM

现代的 Linux 系统,都是基于fstrim实现的 TRIM 操作。使用以下命令可以立即进行 TRIM:

1
fstrim -av

Debian/Ubuntu/RHEL的主流系统,都是实现了一个计划每周运行它的 systemd 计时器服务。

Ubuntu Server 22.04

列出所有计时器,可以看到fstrim.timer默认启用,它最后运行在两天前,9 小时后将会被触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
╭─dsf@jump-server ~ 
╰─$ systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2024-12-29 14:34:55 CST 3min 7s left n/a n/a update-notifier-download.timer update-notifier-download.service
Sun 2024-12-29 14:44:53 CST 13min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Sun 2024-12-29 15:16:56 CST 45min left n/a n/a ua-timer.timer ua-timer.service
Sun 2024-12-29 19:29:48 CST 4h 58min left Sun 2024-12-29 13:54:19 CST 37min ago motd-news.timer motd-news.service
Sun 2024-12-29 20:24:57 CST 5h 53min left Sun 2024-12-29 12:27:19 CST 2h 4min ago apt-daily.timer apt-daily.service
Mon 2024-12-30 00:00:00 CST 9h left n/a n/a dpkg-db-backup.timer dpkg-db-backup.service
Mon 2024-12-30 00:00:00 CST 9h left Sun 2024-12-29 00:00:00 CST 14h ago logrotate.timer logrotate.service
Mon 2024-12-30 00:00:59 CST 9h left Thu 2024-12-26 14:47:01 CST 2 days ago fstrim.timer fstrim.service
Mon 2024-12-30 02:54:28 CST 12h left Sun 2024-12-29 12:09:19 CST 2h 22min ago fwupd-refresh.timer fwupd-refresh.service
Mon 2024-12-30 05:14:26 CST 14h left Sun 2024-12-29 05:16:19 CST 9h ago man-db.timer man-db.service
Mon 2024-12-30 06:07:55 CST 15h left Sun 2024-12-29 06:26:14 CST 8h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Thu 2025-01-02 04:03:52 CST 3 days left Sun 2024-06-30 15:32:51 CST 5 months 29 days ago update-notifier-motd.timer update-notifier-motd.service
Sun 2025-01-05 03:10:33 CST 6 days left Sun 2024-12-29 03:11:14 CST 11h ago e2scrub_all.timer e2scrub_all.service
n/a n/a n/a n/a apport-autoreport.timer apport-autoreport.service
n/a n/a n/a n/a snapd.snap-repair.timer snapd.snap-repair.service

我显式地执行一遍 fstrim,后,再到 PVE 查看虚拟磁盘的大小,disk size 已经是正常大小,问题解决。

Snipaste_2024-12-29_15-49-50

Rocky Linux 9

在 Rocky Linux 9 上,fstrim.timer默认没有启用,需要手动开启。

1
2
3
4
5
6
7
8
9
10
11
12
13
##查看TRIM定时器服务状态
╭─dsf@app ~
╰─$ sudo systemctl status fstrim.timer
○ fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; disabled; preset: disabled)
Active: inactive (dead)
Trigger: n/a
Triggers: ● fstrim.service
Docs: man:fstrim
##开启服务
╭─dsf@app ~
╰─$ sudo systemctl enable fstrim.timer
Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer.

Windows Server 2022 Datacenter

Windows 内置了磁盘整理工具,在开始菜单-Windows工具-磁盘整理和优化驱动器打开。

可以看到运行周期为每月(Windows 默认是每周,这里每月是因为我调整过)。点击优化按钮可以立即进行 TRIM。

Snipaste_2024-12-29_14-41-39

我对这台 Windows 虚拟机立即进行 TRIM 后,其 disk size 从 212G 减小到 103G。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
###TRIM前虚拟磁盘大小
╭─root@pve /var/lib/vz/images
╰─# qemu-img info ./249/vm-249-disk-1.qcow2
image: ./249/vm-249-disk-1.qcow2
file format: qcow2
virtual size: 300 GiB (322122547200 bytes)
disk size: 212 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: ./249/vm-249-disk-1.qcow2
protocol type: file
file length: 300 GiB (322171961344 bytes)
disk size: 212 GiB

###TRIM后虚拟磁盘大小
╭─root@pve /var/lib/vz/images
╰─# qemu-img info ./249/vm-249-disk-1.qcow2
image: ./249/vm-249-disk-1.qcow2
file format: qcow2
virtual size: 300 GiB (322122547200 bytes)
disk size: 103 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: ./249/vm-249-disk-1.qcow2
protocol type: file
file length: 300 GiB (322171961344 bytes)
disk size: 103 GiB

产生的虚拟机备份也显著变小:从 68.48G 减小到 25.67G。103G 磁盘大小的虚拟机,产生的备份为 25.67G,这个压缩率挺高,无怪乎ZSTD (又快又好)

Snipaste_2024-12-29_16-00-34

总结

对虚拟磁盘定期进行 TRIM 是一项很有用的维护操作,能提高磁盘性能,降低备份业务占用的带宽。

由于 LXC 使用的虚拟磁盘格式为.raw,所以无法进行 TRIM 操作。

参考

-EOF

查看最新版,请访问本文链接:https://blog.onehat.cn/p/5355.html

原创作品,转载请保留出处。

评论