问题描述
在OpenStack云环境中,有这样一种场景,用户在虚拟机中创建了大文件,使用完之后删除了这个文件,但实际上,这个文件在底层ceph的存储系统上空间并没有释放。
当用户在虚拟机层的文件系统中删除一个文件,并不会在ceph的rbd设备上的空间填0,而仅仅是在元数据上打上墓碑记录,因此,虽然虚拟机的文件系统知道这些block是未使用的,但在ceph层存储系统并不知道vm文件系统做的操作,依然会认为是有效数据,空间并不会被释放,
解决办法:
1.在image上打上hw_scsi_model和hw_disk_bus的property
glance image-update --property hw_scsi_model=virtio-scsi --property hw_disk_bus=scsi $image_id
其中,hw_scsi_model=virtio-scsi 是指libvirt使用virtio-scsi控制器,hs_disk_bus=scsi是指libvirt使用scsi总线连接磁盘到控制器。
2、nova.conf配置文件包含以下配置
[libvirt]
hw_disk_discard = unmap
验证:
有两种方式可以触发Trim/Discard请求,一种是由文件系统自动完成,一种是用户通过执行命令来完成。
一、文件系统自动完成
只要在挂载文件系统时指定discard参数即可,比如 mount -t ext4 -o discard device mountpoint,这样在文件系统中删除文件后会自动触发Trim/Discard操作,在块设备上释放占用的空间,
需要注意的是,如果image未经过上述配置,那么在mount -o discard的时候会报错not support
二、用户执行命令
用户可以执行命令fstrim来触发Trim/Discard操作,采用这种方式mount文件系统时不需要discard参数。比如,fstrim -v mountpoint,就会释放对应块设备上不用的空间。
需要注意的是,mount的discard参数会导致文件系统性能下降,在并发删除大量小文件时变得很慢,因此需要根据具体场景选择合适的长发方式。
在vm中生成一个大文件
查看ceph层面的rbd设备
删除这个rbd设备
可以看到,当前这个卷在mount的时候开启了discard
此时,rbd空间会自动释放。
但正如上文所说,如果mount时开启了discard对性能会有所影响,根据实际场景选择是mount discard或者fstrim -v mountpoint的方式来释放空间