Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
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)
Esempio n. 4
0
File: numa.py Progetto: nirs/vdsm
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)
Esempio n. 5
0
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)
Esempio n. 6
0
File: vdsmd.py Progetto: nirs/vdsm
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)
Esempio n. 7
0
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