Libvirt-Enable support discard option for disk device¶
Most SCSI devices have supported UNMAP command which is used to return unused or freed blocks back to the storage. And SSD drive have a similar command called “Trim” command.
This blueprint aims to support setting discard option for instance’s disk. If discard option is enabled, unused/freed blocks can be return back to the storage device.
Qemu1.5 has supported setting discard option for the raw disk. In Qemu1.6, qcow2 file supported discard option too.
Cinder support is out of scope for this spec. This spec only covers disks managed by nova.
Thin provision volume¶
When we write data to a thin provision volume, storage device will allocate blocks to it and it will grow. But without discard option supported, the blocks will not be freed to the storage device even if we deleted the data in the volume. The result is the thin volume can grow, but can’t shrink. With discard option supported, when user deleted the data in the volume, the blocks will be freed to the storage device. The volume will shrink.
It’s useful for both ephemeral volume and cinder volume.
SSD backed volume¶
Freeing the unused blocks to the SSD storage is useful to improving the performance and prolonging the lifetime of SSD.
Add support for the deployer to specify the discard option in the nova.conf by “hw_disk_discard”.
There are two available values for “hw_disk_discard” now:
"unmap" : Discard requests("trim" or "unmap") are passed to the filesystem. "ignore": Discard requests("trim" or "unmap") are ignored and aren't passed to the filesystem.
hw_disk_discard=unmap #enable discard hw_disk_discard=ignore #disable discard, by default
For an instance running on a host which has the discard option in nova.conf, nova will produce the XML with a discard option when the nova managed disk is attached.
Data model impact¶
REST API impact¶
Other end user impact¶
Discard option maybe cause performance degradation and fragmentation. But for the storage based on SSD, discard option is good for the performance.
The users have control over this behaviour in the guest os if they don’t want it. They can use the mount parameter or the command tools to control the discard behaviour.
Other deployer impact¶
Initially, only the libvirt driver will support this function, and only with qemu/kvm as the hypervisor.
A serious consideration is needed before enabling discard option. With discard option enabled, the freed blocks of the thin provision volume will be return to the storage and can be reused. But it also maybe cause performance degradation and fragments. So it’s reasonable to enable the discard option only when you use the thin provision volume and the storage are UNMAP/TRIM-capable. For example the SSD, the disk-arrays or other distributed storage which supports the UNMAP/TRIM.
Libvirt driver will create a discard option for a disk device which the instance flavor has discard option.
Libvirt(1.0.6) Qemu1.5(raw format) Qemu1.6(qcow2 format)
The document should be modified to reflect this new feature.