From 8009de499c514a554970febedbd533364e35bf14 Mon Sep 17 00:00:00 2001 From: Wangpan Date: Mon, 8 Apr 2013 17:57:10 +0800 Subject: [PATCH] Add cpuset attr to vcpu conf in libvirt xml Currently the instances can use all of the pcpu of compute node, the host may become slow when vcpus of instances are busy, so we need to pin vcpus to the specific pcpus of host instead of all pcpus. Also added a cache of total vcpus num in libvirt driver here. DocImpact: please refer to the bp page. Implements blueprint: instance-vcpu-pin Change-Id: I6b6e805c15b249cc5e7517e26619d79bb0183de8 --- nova/tests/test_libvirt.py | 99 +++++++++++++++++++++++++++++++ nova/tests/test_libvirt_config.py | 12 ++-- 2 files changed, 107 insertions(+), 4 deletions(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index a955d2f3..437c4c20 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -5097,6 +5097,105 @@ class LibvirtDriverTestCase(test.TestCase): self.libvirtconnection.get_instance_disk_info, instance_name) + def test_get_cpuset_ids(self): + # correct syntax + self.flags(vcpu_pin_set="1") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1], cpuset_ids) + + self.flags(vcpu_pin_set="1,2") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1, 2], cpuset_ids) + + self.flags(vcpu_pin_set=", , 1 , ,, 2, ,") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1, 2], cpuset_ids) + + self.flags(vcpu_pin_set="1-1") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1], cpuset_ids) + + self.flags(vcpu_pin_set=" 1 - 1, 1 - 2 , 1 -3") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1, 2, 3], cpuset_ids) + + self.flags(vcpu_pin_set="1,^2") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1], cpuset_ids) + + self.flags(vcpu_pin_set="1-2, ^1") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([2], cpuset_ids) + + self.flags(vcpu_pin_set="1-3,5,^2") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1, 3, 5], cpuset_ids) + + self.flags(vcpu_pin_set=" 1 - 3 , ^2, 5") + cpuset_ids = self.libvirtconnection._get_cpuset_ids() + self.assertEqual([1, 3, 5], cpuset_ids) + + # invalid syntax + self.flags(vcpu_pin_set=" -1-3,5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-3-,5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="-3,5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-,5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-3,5,^2^") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-3,5,^2-") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="--13,^^5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="a-3,5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-a,5,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-3,b,^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="1-3,5,^c") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="3 - 1, 5 , ^ 2 ") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set=" 1,1, ^1") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set=" 1,^1,^1,2, ^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + + self.flags(vcpu_pin_set="^2") + self.assertRaises(exception.Invalid, + self.libvirtconnection._get_cpuset_ids) + class LibvirtVolumeUsageTestCase(test.TestCase): """Test for nova.virt.libvirt.libvirt_driver.LibvirtDriver diff --git a/nova/tests/test_libvirt_config.py b/nova/tests/test_libvirt_config.py index f98e6dd5..8eed7136 100644 --- a/nova/tests/test_libvirt_config.py +++ b/nova/tests/test_libvirt_config.py @@ -699,6 +699,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.virt_type = "lxc" obj.memory = 1024 * 1024 * 100 obj.vcpus = 2 + obj.cpuset = "0-3,^2,4-5" obj.name = "demo" obj.uuid = "b38a3f43-4be2-4046-897f-b67c2f5e0147" obj.os_type = "exe" @@ -716,7 +717,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): b38a3f43-4be2-4046-897f-b67c2f5e0147 demo 104857600 - 2 + 2 exe /sbin/init @@ -734,6 +735,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.virt_type = "xen" obj.memory = 1024 * 1024 * 100 obj.vcpus = 2 + obj.cpuset = "0-3,^2,4-5" obj.name = "demo" obj.uuid = "b38a3f43-4be2-4046-897f-b67c2f5e0147" obj.os_type = "linux" @@ -756,7 +758,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): b38a3f43-4be2-4046-897f-b67c2f5e0147 demo 104857600 - 2 + 2 linux /tmp/vmlinuz @@ -777,6 +779,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.virt_type = "xen" obj.memory = 1024 * 1024 * 100 obj.vcpus = 2 + obj.cpuset = "0-3,^2,4-5" obj.name = "demo" obj.uuid = "b38a3f43-4be2-4046-897f-b67c2f5e0147" obj.os_type = "hvm" @@ -800,7 +803,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): b38a3f43-4be2-4046-897f-b67c2f5e0147 demo 104857600 - 2 + 2 hvm /usr/lib/xen/boot/hvmloader @@ -824,6 +827,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.virt_type = "kvm" obj.memory = 1024 * 1024 * 100 obj.vcpus = 2 + obj.cpuset = "0-3,^2,4-5" obj.cpu_shares = 100 obj.cpu_quota = 50000 obj.cpu_period = 25000 @@ -853,7 +857,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): b38a3f43-4be2-4046-897f-b67c2f5e0147 demo 104857600 - 2 + 2 Acme