def test_online_cpus(self, raw_value, cpu_set): with tempfile.NamedTemporaryFile() as f: f.write(raw_value + b'\n') f.flush() with MonkeyPatchScope([(taskset, "_SYS_ONLINE_CPUS", f.name)]): self.assertEqual(taskset.online_cpus(), cpu_set)
def test_online_cpus(self, raw_value, cpu_set): with tempfile.NamedTemporaryFile() as f: f.write(raw_value + b'\n') f.flush() with MonkeyPatchScope([(taskset, "_SYS_ONLINE_CPUS", f.name)]): self.assertEqual(taskset.online_cpus(), cpu_set)
def _numa(capabilities=None): if capabilities is None: capabilities = _get_libvirt_caps() topology = defaultdict(dict) distances = defaultdict(dict) sockets = set() siblings = set() online_cpus = [] caps = ET.fromstring(capabilities) cells = caps.findall('.host//cells/cell') for cell in cells: cell_id = cell.get('id') # work around libvirt bug (if not built with numactl) if len(cells) == 1: idx = -1 else: idx = int(cell_id) meminfo = memory_by_cell(idx) topology[cell_id]['totalMemory'] = meminfo['total'] topology[cell_id]['hugepages'] = pages_by_cell(cell, idx) topology[cell_id]['cpus'] = [] distances[cell_id] = [] for cpu in cell.findall('cpus/cpu'): cpu_id = int(cpu.get('id')) topology[cell_id]['cpus'].append(cpu_id) if cpu.get('siblings') and cpu.get('socket_id'): online_cpus.append(cpu_id) sockets.add(cpu.get('socket_id')) siblings.add(cpu.get('siblings')) if cell.find('distances') is not None: for sibling in cell.find('distances').findall('sibling'): distances[cell_id].append(int(sibling.get('value'))) cpu_topology = CpuTopology(len(sockets), len(siblings), len(online_cpus), online_cpus) if not cells: hostcputop = caps.find('.host/cpu/topology') if hostcputop is not None: socketnum = int(hostcputop.get('sockets')) corenum = int(hostcputop.get('cores')) * socketnum threadnum = int(hostcputop.get('threads')) * corenum online_cpus = taskset.online_cpus() cpu_topology = CpuTopology(socketnum, corenum, threadnum, online_cpus) return NumaTopology(topology, distances, cpu_topology)
def _numa(capabilities=None): if capabilities is None: capabilities = _get_libvirt_caps() topology = defaultdict(dict) distances = defaultdict(dict) sockets = set() siblings = set() online_cpus = [] caps = ET.fromstring(capabilities) cells = caps.findall('.host//cells/cell') for cell in cells: cell_id = cell.get('id') # work around libvirt bug (if not built with numactl) if len(cells) == 1: idx = -1 else: idx = int(cell_id) meminfo = memory_by_cell(idx) topology[cell_id]['totalMemory'] = meminfo['total'] topology[cell_id]['cpus'] = [] distances[cell_id] = [] for cpu in cell.findall('cpus/cpu'): topology[cell_id]['cpus'].append(int(cpu.get('id'))) if cpu.get('siblings') and cpu.get('socket_id'): online_cpus.append(cpu.get('id')) sockets.add(cpu.get('socket_id')) siblings.add(cpu.get('siblings')) if cell.find('distances') is not None: for sibling in cell.find('distances').findall('sibling'): distances[cell_id].append(int(sibling.get('value'))) cpu_topology = CpuTopology(len(sockets), len(siblings), len(online_cpus), online_cpus) if not cells: hostcputop = caps.find('.host/cpu/topology') if hostcputop is not None: socketnum = int(hostcputop.get('sockets')) corenum = int(hostcputop.get('cores')) * socketnum threadnum = int(hostcputop.get('threads')) * corenum online_cpus = taskset.online_cpus() cpu_topology = CpuTopology(socketnum, corenum, threadnum, online_cpus) return NumaTopology(topology, distances, cpu_topology)
def __set_cpu_affinity(): cpu_affinity = config.get('vars', 'cpu_affinity') if cpu_affinity == "": return online_cpus = taskset.online_cpus() log = logging.getLogger('vds') if len(online_cpus) == 1: log.debug('Only one cpu detected: affinity disabled') return if cpu_affinity.lower() == taskset.AUTOMATIC: cpu_set = frozenset((taskset.pick_cpu(online_cpus), )) else: cpu_set = frozenset( int(cpu.strip()) for cpu in cpu_affinity.split(",")) log.info('VDSM will run with cpu affinity: %s', cpu_set) taskset.set(os.getpid(), cpu_set, all_tasks=True)
def __set_cpu_affinity(): cpu_affinity = config.get('vars', 'cpu_affinity') if cpu_affinity == "": return online_cpus = taskset.online_cpus() log = logging.getLogger('vds') if len(online_cpus) == 1: log.debug('Only one cpu detected: affinity disabled') return if cpu_affinity.lower() == taskset.AUTOMATIC: cpu_set = frozenset((taskset.pick_cpu(online_cpus),)) else: cpu_set = frozenset(int(cpu.strip()) for cpu in cpu_affinity.split(",")) log.info('VDSM will run with cpu affinity: %s', cpu_set) taskset.set(os.getpid(), cpu_set, all_tasks=True)
def update(): capabilities = libvirtconnection.get().getCapabilities() if capabilities == _cache.capabilities: return topology = defaultdict(dict) distances = defaultdict(dict) sockets = set() siblings = set() core_cpus = defaultdict(lambda: set()) # Sets of CPU IDs online_cpus = [] cpu_info = [] caps = ET.fromstring(capabilities) cells = caps.findall('.host//cells/cell') for cell in cells: cell_id = cell.get('id') # work around libvirt bug (if not built with numactl) if len(cells) == 1: idx = -1 else: idx = int(cell_id) meminfo = memory_by_cell(idx) topology[cell_id]['totalMemory'] = meminfo['total'] topology[cell_id]['hugepages'] = pages_by_cell(cell, idx) topology[cell_id]['cpus'] = [] distances[cell_id] = [] for cpu in cell.findall('cpus/cpu'): cpu_id = int(cpu.get('id')) topology[cell_id]['cpus'].append(cpu_id) if cpu.get('siblings') and cpu.get('socket_id') and \ cpu.get('core_id'): core_id = int(cpu.get('core_id')) die_id = int(cpu.get('die_id', 0)) socket_id = int(cpu.get('socket_id')) online_cpus.append(cpu_id) sockets.add(socket_id) siblings.add(cpu.get('siblings')) cpu_info.append( CpuInfo(cpu_id=cpu_id, numa_cell_id=int(cell_id), socket_id=socket_id, die_id=die_id, core_id=core_id)) core_cpus[(socket_id, die_id, core_id)].add(cpu_id) if cell.find('distances') is not None: for sibling in cell.find('distances').findall('sibling'): distances[cell_id].append(int(sibling.get('value'))) cpu_topology = CpuTopology(len(sockets), len(siblings), len(online_cpus), online_cpus) if not cells: hostcputop = caps.find('.host/cpu/topology') if hostcputop is not None: socketnum = int(hostcputop.get('sockets')) corenum = int(hostcputop.get('cores')) * socketnum threadnum = int(hostcputop.get('threads')) * corenum online_cpus = taskset.online_cpus() cpu_topology = CpuTopology(socketnum, corenum, threadnum, online_cpus) _cache.numa = NumaTopology(topology, distances, cpu_topology, cpu_info, core_cpus) _cache.capabilities = capabilities