diff options
| author | Daniel P. Berrange <berrange@redhat.com> | 2012-06-28 12:35:04 +0100 |
|---|---|---|
| committer | Daniel P. Berrange <berrange@redhat.com> | 2012-07-06 11:40:21 +0100 |
| commit | 9698a45a308f54865811e67498e8f0500c8187f2 (patch) | |
| tree | 06f37aa82c157fb04ec22cbef34c2c88a3bf74d4 | |
| parent | 4bbb9cfde27cd3c8268caf272d04a009b50c7a08 (diff) | |
Set the default CPU mode to 'host-model' for Libvirt KVM/QEMU guests
Historically Nova has not set any CPU model for guests started with
the libvirt driver. This means they are all using the per-hyervisor
default settings for CPU model. With KVM/QEMU guests the model was
traditionally a very conserative choice which exposed minimal features.
This is significantly limits the performance of applications. Further
the model has changed over time, so the exact default model is
unpredictable. Switching Nova to use the host CPU model by default
should improve the out of the box performance & give a known
setup.
This does not impact migration compatibility, since the migration
code is already doing comparison checks against the source and
destination host CPU model, regardless of the actual model used
in the guest. In the future the migration code should be tweaked
so that it actually compares the current guest CPU model, against
the target host CPU model, which would potentially broaden the
migration compatibility pool.
With this patch there is a new libvirt_cpu_mode="none" which
can be used to explicitly prevent any CPU model setting in the
instance XML. The default value None, will now default to
"none" for LXC/UML/etc, and "host-model" for QEMU/KVM
Fixes: bug #1003373
Implements: blueprint libvirt-xml-cpu-model
Change-Id: I5b96e4532b6a960e1608dd6e19ae9d194379fb6a
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
| -rw-r--r-- | nova/tests/test_libvirt.py | 46 | ||||
| -rw-r--r-- | nova/virt/libvirt/driver.py | 14 |
2 files changed, 57 insertions, 3 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 86128626a..357ab0493 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -608,6 +608,52 @@ class LibvirtConnTestCase(test.TestCase): self.assertEquals(cfg.devices[3].target_dev, 'vdd') def test_get_guest_cpu_config_none(self): + self.flags(libvirt_cpu_mode="none") + conn = libvirt_driver.LibvirtDriver(True) + instance_ref = db.instance_create(self.context, self.test_instance) + + conf = conn.get_guest_config(instance_ref, + _fake_network_info(self.stubs, 1), + None, None) + self.assertEquals(conf.cpu, None) + + def test_get_guest_cpu_config_default_kvm(self): + self.flags(libvirt_type="kvm", + libvirt_cpu_mode=None) + + def get_lib_version_stub(self): + return (0 * 1000 * 1000) + (9 * 1000) + 11 + + self.stubs.Set(libvirt.virConnect, + "getLibVersion", + get_lib_version_stub) + conn = libvirt_driver.LibvirtDriver(True) + instance_ref = db.instance_create(self.context, self.test_instance) + + conf = conn.get_guest_config(instance_ref, + _fake_network_info(self.stubs, 1), + None, None) + self.assertEquals(type(conf.cpu), + config.LibvirtConfigGuestCPU) + self.assertEquals(conf.cpu.mode, "host-model") + self.assertEquals(conf.cpu.model, None) + + def test_get_guest_cpu_config_default_uml(self): + self.flags(libvirt_type="uml", + libvirt_cpu_mode=None) + + conn = libvirt_driver.LibvirtDriver(True) + instance_ref = db.instance_create(self.context, self.test_instance) + + conf = conn.get_guest_config(instance_ref, + _fake_network_info(self.stubs, 1), + None, None) + self.assertEquals(conf.cpu, None) + + def test_get_guest_cpu_config_default_lxc(self): + self.flags(libvirt_type="lxc", + libvirt_cpu_mode=None) + conn = libvirt_driver.LibvirtDriver(True) instance_ref = db.instance_create(self.context, self.test_instance) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 14f5620c9..0f62a9c52 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -168,9 +168,11 @@ libvirt_opts = [ cfg.StrOpt('libvirt_cpu_mode', default=None, help='Set to "host-model" to clone the host CPU feature flags; ' - 'to "host-passthrough" to use the host CPU model ' - 'exactly; or to "custom" to use a named CPU model. Only ' - 'has effect if libvirt_type="kvm|qemu"'), + 'to "host-passthrough" to use the host CPU model exactly; ' + 'to "custom" to use a named CPU model; ' + 'to "none" to not set any CPU model. ' + 'If libvirt_type="kvm|qemu", it will default to ' + '"host-model", otherwise it will default to "none"'), cfg.StrOpt('libvirt_cpu_model', default=None, help='Set to a named libvirt CPU model (see names listed ' @@ -1504,6 +1506,12 @@ class LibvirtDriver(driver.ComputeDriver): model = FLAGS.libvirt_cpu_model if mode is None: + if FLAGS.libvirt_type == "kvm" or FLAGS.libvirt_type == "qemu": + mode = "host-model" + else: + mode = "none" + + if mode == "none": return None if FLAGS.libvirt_type != "kvm" and FLAGS.libvirt_type != "qemu": |
