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
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
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
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
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
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(' ')]
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)