From 86e6f34eca14b8271a974f06bff7be179449c90b Mon Sep 17 00:00:00 2001 From: Yaguang Tang Date: Fri, 15 Feb 2013 23:41:02 +0800 Subject: Add support for instance disk IO control. Part 3 for blueprint quota-instance-resource, by setting exposed params "disk_read_bytes_sec, disk_read_iops_sec, disk_write_bytes_sec, disk_write_iops_sec, disk_total_bytes_sec, disk_total_iops_sec" through nova flavor-set, user can implement instance disk IO control policy. for example: nova flavor-set m1.medium set disk_write_bytes_sec=10240000, then the max disk write IO is 10MB/s for VM user. partly implement blueprint quota-instance-resource original reviews https://review.openstack.org/#/c/14151/ DocImpact Change-Id: I8605acf61d7ddbfdaf6eee3ab135898df2449484 --- nova/tests/fake_imagebackend.py | 2 +- nova/virt/libvirt/driver.py | 3 ++- nova/virt/libvirt/imagebackend.py | 14 +++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/nova/tests/fake_imagebackend.py b/nova/tests/fake_imagebackend.py index c284a5042..48426505e 100644 --- a/nova/tests/fake_imagebackend.py +++ b/nova/tests/fake_imagebackend.py @@ -41,7 +41,7 @@ class Backend(object): pass def libvirt_info(self, disk_bus, disk_dev, device_type, - cache_mode): + cache_mode, extra_specs): info = config.LibvirtConfigGuestDisk() info.source_type = 'file' info.source_device = device_type diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 386fe836c..c3bef84ba 100755 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1680,7 +1680,8 @@ class LibvirtDriver(driver.ComputeDriver): return image.libvirt_info(disk_info['bus'], disk_info['dev'], disk_info['type'], - self.disk_cachemode) + self.disk_cachemode, + instance['extra_specs']) def get_guest_storage_config(self, instance, image_meta, disk_info, diff --git a/nova/virt/libvirt/imagebackend.py b/nova/virt/libvirt/imagebackend.py index 0a84b22e5..bcaf1de5a 100755 --- a/nova/virt/libvirt/imagebackend.py +++ b/nova/virt/libvirt/imagebackend.py @@ -86,13 +86,15 @@ class Image(object): """ pass - def libvirt_info(self, disk_bus, disk_dev, device_type, cache_mode): + def libvirt_info(self, disk_bus, disk_dev, device_type, cache_mode, + extra_specs): """Get `LibvirtConfigGuestDisk` filled for this image. :disk_dev: Disk bus device name :disk_bus: Disk bus type :device_type: Device type for this image. :cache_mode: Caching mode for this image + :extra_specs: Instance type extra specs dict. """ info = vconfig.LibvirtConfigGuestDisk() info.source_type = self.source_type @@ -104,6 +106,16 @@ class Image(object): driver_name = libvirt_utils.pick_disk_driver_name(self.is_block_dev) info.driver_name = driver_name info.source_path = self.path + + tune_items = ['disk_read_bytes_sec', 'disk_read_iops_sec', + 'disk_write_bytes_sec', 'disk_write_iops_sec', + 'disk_total_bytes_sec', 'disk_total_iops_sec'] + # Note(yaguang): Currently, the only tuning available is Block I/O + # throttling for qemu. + if self.source_type in ['file', 'block']: + for key, value in extra_specs.iteritems(): + if key in tune_items: + setattr(info, key, value) return info def cache(self, fetch_func, filename, size=None, *args, **kwargs): -- cgit