[et-mgmt-tools] [PATCH] Add virt-install option to auto choose cpuset value (NUMA)

Cole Robinson crobinso at redhat.com
Fri Mar 14 19:36:53 UTC 2008


The patch below adds an option to virt-install to auto choose
physical cpu pinning based on available memory on a NUMA machine.
Conceivably this could be expanded in the future to auto choose
by some other metric as well, but for now only a NUMA setup is
implemented.

Using --cpuset=auto will create a traditional cpuset argument
using all the cpus associated with the cell that best fits the
requested guest memory.

The only question I have for those interested: Is best fit an 
appropriate default choice? should there be a way to choose 
another scheme (i.e. worst fit)?

Thanks,
Cole

diff -r 465f440a8a42 virt-install
--- a/virt-install	Fri Mar 14 10:55:32 2008 -0400
+++ b/virt-install	Fri Mar 14 15:16:39 2008 -0400
@@ -400,7 +400,7 @@ def main():
 
     # set up cpuset
     if type == "xen":
-        cli.get_cpuset(options.cpuset, guest)
+        cli.get_cpuset(options.cpuset, guest.memory, guest, conn)
 
     # set up disks
     get_disks(options.diskfile, options.disksize, options.sparse, options.nodisks,
diff -r 465f440a8a42 virtinst/cli.py
--- a/virtinst/cli.py	Fri Mar 14 10:55:32 2008 -0400
+++ b/virtinst/cli.py	Fri Mar 14 15:16:39 2008 -0400
@@ -26,7 +26,7 @@ from optparse import OptionValueError
 
 import libvirt
 import util
-import Guest
+import Guest, CapabilitiesParser
 
 MIN_RAM = 64
 force = False
@@ -189,9 +189,38 @@ def get_vcpus(vcpus, check_cpu, guest, c
         except ValueError, e:
             print _("ERROR: "), e
 
-def get_cpuset(cpuset, guest):
-    if cpuset:
+def get_cpuset(cpuset, mem, guest, conn):
+    if cpuset != "auto":
         guest.cpuset = cpuset
+    else:
+        caps = CapabilitiesParser.parse(conn.getCapabilities())
+        cells = caps.host.topology.cells
+        if len(cells) <= 1:
+            logging.debug("Capabilities only show <= 1 cell. Not NUMA capable")
+            print >> sys.stderr, _("This system is not NUMA capable.")
+            sys.exit(1)
+
+        cell_mem = conn.getCellsFreeMemory(0, len(cells))
+        cell_id = -1
+        mem = mem * 1024 * 1024
+        for i in range(len(cells)):
+            if cell_mem[i] > mem and len(cells[i].cpus) != 0:
+                # Find smallest cell that fits
+                if cell_id < 0 or cell_mem[i] < cell_mem[cell_id]:
+                    cell_id = i;
+        if cell_id < 0:
+            print >> sys.stderr,\
+                     _("Could not find any usable NUMA cell/cpu combinations")
+            sys.exit(1)
+
+        # Build cpuset
+        cpustr = ""
+        for cpu in cells[cell_id].cpus:
+            if cpustr != "":
+                cpustr += ","
+            cpustr += str(cpu.id)
+        guest.cpuset = cpustr
+    return
 
 def get_network(mac, network, guest):
     if mac == "RANDOM":




More information about the et-mgmt-tools mailing list