Example #1
0
def _transfer_processes(subsystem, fromgroup, togroup):
    """Do the transfer of processes"""
    pids = cgroups.get_data(subsystem, fromgroup, 'tasks')
    for pid in pids.strip().split('\n'):
        try:
            cgroups.set_value(subsystem, togroup, 'tasks', pid)
        except IOError as ioe:  # pylint: disable=W0702
            if ioe.errno not in [errno.EINVAL, errno.ESRCH]:
                raise
Example #2
0
def get_blkio_info(cgrp, pseudofile):
    """Get blkio throttle info."""
    blkio_data = cgroups.get_data('blkio', cgrp, pseudofile)
    blkio_info = {}
    for entry in blkio_data.split('\n'):
        if not entry or entry.startswith('Total'):
            continue

        major_minor, metric_type, value = entry.split(' ')
        blkio_info.setdefault(major_minor, {})[metric_type] = int(value)

    return blkio_info
Example #3
0
def get_blkio_value(cgrp, pseudofile):
    """Get blkio basic info"""
    blkio_data = cgroups.get_data('blkio', cgrp, pseudofile)
    blkio_info = {}
    for entry in blkio_data.split('\n'):
        if not entry:
            continue

        major_minor, value = entry.split(' ')
        blkio_info[major_minor] = int(value)

    return blkio_info
Example #4
0
def get_cpuset_cores(cgrp):
    """Get list of enabled cores."""
    cores = []
    cpuset = cgroups.get_data('cpuset', cgrp, 'cpuset.cpus')
    for entry in cpuset.split(','):
        cpus = entry.split('-')
        if len(cpus) == 1:
            cores.append(int(cpus[0]))
        elif len(cpus) == 2:
            cores.extend(six.moves.range(int(cpus[0]), int(cpus[1]) + 1))

    return cores
Example #5
0
def get_stat(subsystem, cgrp):
    """ Get stat key values aooording to stat file format
    """
    pseudofile = '%s.stat' % subsystem
    stat_str = cgroups.get_data(subsystem, cgrp, pseudofile)

    stat_lines = stat_str.split('\n')
    stats = {}
    for stat_line in stat_lines:
        stat_kv = stat_line.strip().split(' ')
        stats[stat_kv[0]] = int(stat_kv[1])

    return stats
Example #6
0
def per_cpu_usage(cgrp):
    """Return (in naoseconds) the length of time on each cpu"""
    usage_str = cgroups.get_data('cpuacct', cgrp, 'cpuacct.usage_percpu')
    return [int(nanosec) for nanosec in usage_str.split(' ')]
Example #7
0
def create_treadmill_cgroups(system_cpu_shares, treadmill_cpu_shares,
                             treadmill_core_cpu_shares,
                             treadmill_apps_cpu_shares, treadmill_cpu_cores,
                             treadmill_mem, treadmill_core_mem):
    """This is the core cgroup setup. Should be applied to a cleaned env."""

    create('cpu', 'system')
    create('cpu', 'treadmill')
    create('cpu', 'treadmill/core')
    create('cpu', 'treadmill/apps')

    cgroups.set_value('cpu', 'treadmill', 'cpu.shares', treadmill_cpu_shares)
    cgroups.set_value('cpu', 'system', 'cpu.shares', system_cpu_shares)
    cgroups.set_value('cpu', 'treadmill/core', 'cpu.shares',
                      treadmill_core_cpu_shares)
    cgroups.set_value('cpu', 'treadmill/apps', 'cpu.shares',
                      treadmill_apps_cpu_shares)

    create('cpuacct', 'system')
    create('cpuacct', 'treadmill')
    create('cpuacct', 'treadmill/core')
    create('cpuacct', 'treadmill/apps')

    create('cpuset', 'system')
    create('cpuset', 'treadmill')

    mems = cgroups.get_value('cpuset', '', 'cpuset.mems')
    cgroups.set_value('cpuset', 'system', 'cpuset.mems', mems)
    cgroups.set_value('cpuset', 'treadmill', 'cpuset.mems', mems)

    cores_max = sysinfo.cpu_count() - 1
    if treadmill_cpu_cores > cores_max:
        raise exc.TreadmillError('Not enough cpu cores.')

    if treadmill_cpu_cores > 0:
        cgroups.set_value('cpuset', 'treadmill', 'cpuset.cpus',
                          '%d-%d' % (0, treadmill_cpu_cores - 1))
        cgroups.set_value('cpuset', 'system', 'cpuset.cpus',
                          '%d-%d' % (treadmill_cpu_cores, cores_max))
    else:
        cgroups.set_value('cpuset', 'treadmill', 'cpuset.cpus',
                          '%d-%d' % (0, cores_max))
        cgroups.set_value('cpuset', 'system', 'cpuset.cpus',
                          '%d-%d' % (0, cores_max))

    create('memory', 'system')
    create('memory', 'treadmill')

    if cgroups.get_value('memory', 'treadmill', 'memory.use_hierarchy') != 1:
        cgroups.set_value('memory', 'treadmill', 'memory.use_hierarchy', '1')
    set_memory_hardlimit('treadmill', treadmill_mem)

    oom_value = 'oom_kill_disable 0\nunder_oom 0\n'
    if cgroups.get_data('memory', 'treadmill',
                        'memory.oom_control') != oom_value:
        cgroups.set_value('memory', 'treadmill', 'memory.oom_control', '0')

    create('memory', 'treadmill/core')
    create('memory', 'treadmill/apps')

    set_memory_hardlimit('treadmill/core', treadmill_core_mem)
    cgroups.set_value('memory', 'treadmill/core', 'memory.soft_limit_in_bytes',
                      treadmill_core_mem)

    # It is possible to use qualifiers in the input, for calculation of the
    # difference, get memory limits in bytes as defined in cgroup.
    total_mem_bytes = cgroups.get_value('memory', 'treadmill',
                                        'memory.limit_in_bytes')

    core_mem_bytes = cgroups.get_value('memory', 'treadmill/core',
                                       'memory.limit_in_bytes')

    apps_mem_bytes = (total_mem_bytes - core_mem_bytes)
    set_memory_hardlimit('treadmill/apps', apps_mem_bytes)