From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andre Przywara Subject: [Patch] fix automatic NUMA placement Date: Thu, 22 May 2008 14:33:01 +0200 Message-ID: <483567FD.2080806@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------010508090300000406040809" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------010508090300000406040809 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, the automatic NUMA placement code (find_relaxed_node) in XendDomainInfo.py contains several bugs: 1. The domain just created shall not be considered in the load calculation. 2. Nodes with too less memory for the domain must be considered during the load calculation phase and abandoned later, currently these nodes win with a load of 0. 3. CPUs which are offline shall not be considered in load calculation. 4. (Integer-)Dividing the load value by the number of cores per node may conceal subtle load differences resulting in a non-optimal node to be chosen. Attached patch fixes these bugs. Signed-off-by: Andre Przywara Regards, Andre. P.S. If you don't like the lambda expression, you can use the more C-like version in the next line: if dom.domid == self.domid: continue -- Andre Przywara AMD-Operating System Research Center (OSRC), Dresden, Germany Tel: +49 351 277-84917 ----to satisfy European Law for business letters: AMD Saxony Limited Liability Company & Co. KG, Wilschdorfer Landstr. 101, 01109 Dresden, Germany Register Court Dresden: HRA 4896, General Partner authorized to represent: AMD Saxony LLC (Wilmington, Delaware, US) General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy --------------010508090300000406040809 Content-Type: text/plain; name="nodeload.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="nodeload.patch" diff -r e48453f82d30 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Thu May 22 10:41:49 2008 +0100 +++ b/tools/python/xen/xend/XendDomainInfo.py Thu May 22 13:48:36 2008 +0200 @@ -2091,28 +2091,28 @@ class XendDomainInfo: xc.vcpu_setaffinity(self.domid, v, self.info['cpus'][v]) else: def find_relaxed_node(node_list): - import sys + import sys + nr_nodes = info['nr_nodes'] if node_list is None: - node_list = range(0, info['nr_nodes']) + node_list = range(0, nr_nodes) nodeload = [0] - nodeload = nodeload * info['nr_nodes'] + nodeload = nodeload * nr_nodes from xen.xend import XendDomain doms = XendDomain.instance().list('all') - for dom in doms: + for dom in filter (lambda d: d.domid != self.domid, doms): cpuinfo = dom.getVCPUInfo() for vcpu in sxp.children(cpuinfo, 'vcpu'): - def vinfo(n, t): - return t(sxp.child_value(vcpu, n)) - cpumap = vinfo('cpumap', list) - for i in node_list: + if sxp.child_value(vcpu, 'online') == 0: continue + cpumap = list(sxp.child_value(vcpu,'cpumap')) + for i in range(0, nr_nodes): node_cpumask = info['node_to_cpu'][i] for j in node_cpumask: if j in cpumap: nodeload[i] += 1 break - for i in node_list: - if len(info['node_to_cpu'][i]) > 0: - nodeload[i] = int(nodeload[i] / len(info['node_to_cpu'][i])) + for i in range(0, nr_nodes): + if len(info['node_to_cpu'][i]) > 0 and i in node_list: + nodeload[i] = int(nodeload[i] * 16 / len(info['node_to_cpu'][i])) else: nodeload[i] = sys.maxint index = nodeload.index( min(nodeload) ) --------------010508090300000406040809 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------010508090300000406040809--