Add ability to support discard/unmap/trim for Cinder backend

Currently, libvirt/qemu has support for a discard option when
attaching a volume to an instance. With this feature, the
unmap/trim command can be sent from guest to the physical
storage device. A cinder back-end will report a connection
capability that Nova will use in attaching a volume.

Change-Id: I4acb9dbb3c239c1b6b94dca3d2ab438296685a33
Implements: bp cinder-backend-report-discard
This commit is contained in:
Daniel Wilson 2015-07-30 13:15:53 -07:00 committed by Patrick East
parent bfe27222fc
commit 1479e3970c

View File

@ -0,0 +1,194 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
============================================================
Add ability to support discard/unmap/trim for Cinder backend
============================================================
https://blueprints.launchpad.net/nova/+spec/cinder-backend-report-discard
Currently, libvirt/qemu has support for a discard option when attaching a
volume to an instance. With this feature, the unmap/trim command can be sent
from guest to the physical storage device.
A cinder back-end will report a connection capability that Nova will use
in attaching a volume.
Problem description
===================
Currently there is no way for Nova to know if a Cinder back end supports
discard/trim/unmap functionality. Functionality is being added in Cinder
to supply this information. The spec seeks to add the ability to consume
that information.
Use Cases
---------
If a Cinder backend uses media that can make use of discard functionality
there should be a way to do this. This will improve long term performance
of such back ends.
Proposed change
===============
Code will be added to check for a 'discard' property returned to Nova from
the Cinder attach API. When present and set to True we will modify the config
returned by the libvirt volume driver to contain::
driver_discard = "unmap"
This will only give the desired support if the instance is configured with a
interface and bus type that will support Trim/Unmap commands. In the case where
it is possible to detect that discard will not actually work for the instance
we will log a warning, but continue on with the attach anyway.
Currently the virtio-blk backend does not support discard.
There will be several ways to get an instance that will support discard, one
example is to use the virtio-scsi storage interface with a scsi bus type. To
create an instance with this support it must be booted from an image
configured with ``hw_scsi_model=virtio-scsi`` and ``hw_disk_bus=scsi``.
It is important to note that the nova.conf option hw_disk_discard is NOT read
for this feature. We rely entirely on Cinder to specify whether or not discard
should be used for the volume.
Alternatives
------------
Alternatives include adding discard for all drives if the operator has set
hw_disk_discard but it was decided this was not a good way to solve the
problem as you could not mix different underlying volume providers easily.
We could also hot-plug a SCSI controller that is capable of supporting discard
when attaching Cinder volumes. This would allow for mixing a non-trim boot
disk from an image and then attaching a Cinder volume that would get the
benefits. The risk is that the instance may not be able to actually support
doing UNMAP.
Data model impact
-----------------
None
REST API impact
---------------
None
Security impact
---------------
None
Notifications impact
--------------------
None
Other end user impact
---------------------
None
Performance Impact
------------------
There will be a performance gain for back ends that benefit from having
discard functionality.
See https://en.wikipedia.org/wiki/Trim_(computing) for more info.
Other deployer impact
---------------------
Deployers wanting to use this feature with their Cinder backend will need to
ensure the instances are configured with a SCSI model and bus that support
discard. This includes IDE, AHCI, and Xen disks. virtio-blk is the only
backend missing this support.
A simple way to enable this is to modify Glance images to contain the
following properties::
hw_scsi_model=virtio-scsi
hw_disk_bus=scsi
In addition compute nodes will need to be using libvirt 1.0.6 or higher and
QEMU 1.6.0 or higher.
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
* Patrick East
Work Items
----------
* Modify volume attach code in libvirt driver to check for the new Cinder
connection property.
* Add unit tests for new functionality, modify any existing as needed.
* Configure Pure Storage 3rd party CI system to enable the feature and
validate it as a Cinder CI. This configuration change will be made available
to any other 3rd party CI maintainer to allow additional systems to test with
this feature enabled.
Dependencies
============
Cinder Blueprint (Completed and released in Liberty):
https://blueprints.launchpad.net/cinder/+spec/cinder-backend-report-discard
Testing
=======
Unit tests needs to include all permutations of the discard
flag from Cinder.
We could enable one of the jenkins jobs to be configured to enable this. A nice
starting point would maybe be the Ceph jobs. Potentially a Tempest test could
be added behind a config option to validate volume attachments do get the
correct discard settings.
Documentation Impact
====================
We may want to add documentation to the Cloud Administrator Guide on how to
utilize this feature.
References
==========
Cinder Blueprint:
https://blueprints.launchpad.net/cinder/+spec/cinder-backend-report-discard
Cinder Spec:
http://specs.openstack.org/openstack/cinder-specs/specs/liberty/cinder-backend-report-discard.html
History
=======
.. list-table:: Revisions
:header-rows: 1
* - Release Name
- Description
* - Mitaka
- Introduced