def create_treadmill_cgroups(treadmill_core_cpu_shares, treadmill_apps_cpu_shares, treadmill_core_cpuset_cpus, treadmill_apps_cpuset_cpus, treadmill_core_memory, treadmill_apps_memory): """This is the core cgroup setup. Should be applied to a cleaned env. """ create('cpu', 'treadmill/core') create('cpu', 'treadmill/apps') 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', 'treadmill/core') create('cpuacct', 'treadmill/apps') # CPU sets create('cpuset', 'treadmill/core') create('cpuset', 'treadmill/apps') cgroups.inherit_value('cpuset', 'treadmill/core', 'cpuset.mems') cgroups.inherit_value('cpuset', 'treadmill/apps', 'cpuset.mems') # cgroup combines duplicate cores automatically cgroups.set_value( 'cpuset', 'treadmill/core', 'cpuset.cpus', treadmill_core_cpuset_cpus ) cgroups.set_value( 'cpuset', 'treadmill/apps', 'cpuset.cpus', treadmill_apps_cpuset_cpus ) # Memory create('memory', 'treadmill/core') create('memory', 'treadmill/apps') set_memory_hardlimit('treadmill/core', treadmill_core_memory) cgroups.set_value('memory', 'treadmill/core', 'memory.soft_limit_in_bytes', treadmill_core_memory) set_memory_hardlimit('treadmill/apps', treadmill_apps_memory) cgroups.set_value('memory', 'treadmill/apps', 'memory.soft_limit_in_bytes', treadmill_apps_memory)
def _configure_service_cgroups(cgroup, root_cgroup): """Configure service specific cgroups.""" from treadmill import cgroups from treadmill import cgutils if cgroup == '.': cgroup = os.path.basename(os.path.realpath('.')) if os.path.isabs(cgroup): group = os.path.join(root_cgroup, cgroup.lstrip('/')) else: group = os.path.join( cgutils.core_group_name(root_cgroup), cgroup ) parent = os.path.dirname(group) # create group directory for subsystem in ['memory', 'cpu', 'cpuacct', 'cpuset', 'blkio']: _LOGGER.info('creating : %s/%s', subsystem, group) cgutils.create(subsystem, group) # set memory usage limits memlimits = ['memory.limit_in_bytes', 'memory.memsw.limit_in_bytes', 'memory.soft_limit_in_bytes'] for limit in memlimits: parent_limit = cgroups.get_value('memory', parent, limit) _LOGGER.info('setting %s: %s', limit, parent_limit) cgroups.set_value('memory', group, limit, parent_limit) # set cpu share limits cpulimits = ['cpu.shares'] for limit in cpulimits: parent_limit = cgroups.get_value('cpu', parent, limit) _LOGGER.info('setting %s: %s', limit, parent_limit) cgroups.set_value('cpu', group, limit, parent_limit) # set cpuset cgroups.inherit_value('cpuset', group, 'cpuset.cpus') cgroups.inherit_value('cpuset', group, 'cpuset.mems') # join cgroup for subsystem in ['memory', 'cpu', 'cpuacct', 'cpuset', 'blkio']: _LOGGER.info('joining: %s/%s', subsystem, group) cgroups.join(subsystem, group)
def create_treadmill_cgroups(core_cpu_shares, apps_cpu_shares, core_cpuset_cpus, apps_cpuset_cpus, core_memory, apps_memory): """This is the core cgroup setup. Should be applied to a cleaned env. """ # CPU and CPU Accounting (typically joined). create('cpu', 'treadmill/core') create('cpu', 'treadmill/apps') create('cpuacct', 'treadmill/core') create('cpuacct', 'treadmill/apps') if core_cpu_shares is not None: cgroups.set_value('cpu', 'treadmill/core', 'cpu.shares', core_cpu_shares) cgroups.set_value('cpu', 'treadmill/apps', 'cpu.shares', apps_cpu_shares) # CPU sets create('cpuset', 'treadmill/core') create('cpuset', 'treadmill/apps') cgroups.inherit_value('cpuset', 'treadmill/core', 'cpuset.mems') cgroups.inherit_value('cpuset', 'treadmill/apps', 'cpuset.mems') # cgroup combines duplicate cores automatically if core_cpuset_cpus is not None: cgroups.set_value('cpuset', 'treadmill/core', 'cpuset.cpus', core_cpuset_cpus) cgroups.set_value('cpuset', 'treadmill/apps', 'cpuset.cpus', apps_cpuset_cpus) # Memory create('memory', 'treadmill/core') create('memory', 'treadmill/apps') if core_memory is not None: set_memory_hardlimit('treadmill/core', core_memory) cgroups.set_value('memory', 'treadmill/core', 'memory.soft_limit_in_bytes', core_memory) set_memory_hardlimit('treadmill/apps', apps_memory) cgroups.set_value('memory', 'treadmill/apps', 'memory.soft_limit_in_bytes', apps_memory)
def _configure_core_cgroups(service_name): """Configure service specific cgroups.""" from treadmill import cgroups from treadmill import cgutils if service_name == '.': service_name = os.path.basename(os.path.realpath(service_name)) group = os.path.join('treadmill/core', service_name) # create group directory for subsystem in ['memory', 'cpu', 'cpuacct', 'cpuset', 'blkio']: _LOGGER.info('creating : %s/%s', subsystem, group) cgutils.create(subsystem, group) # set memory usage limits memlimits = [ 'memory.limit_in_bytes', 'memory.memsw.limit_in_bytes', 'memory.soft_limit_in_bytes' ] for limit in memlimits: parent_limit = cgroups.get_value('memory', 'treadmill/core', limit) _LOGGER.info('setting %s: %s', limit, parent_limit) cgroups.set_value('memory', group, limit, parent_limit) # set cpu share limits cpulimits = ['cpu.shares'] for limit in cpulimits: parent_limit = cgroups.get_value('cpu', 'treadmill/core', limit) _LOGGER.info('setting %s: %s', limit, parent_limit) cgroups.set_value('cpu', group, limit, parent_limit) # set cpuset cgroups.inherit_value('cpuset', group, 'cpuset.cpus') cgroups.inherit_value('cpuset', group, 'cpuset.mems') # join cgroup for subsystem in ['memory', 'cpu', 'cpuacct', 'cpuset', 'blkio']: _LOGGER.info('joining: %s/%s', subsystem, group) cgroups.join(subsystem, group)
def create_treadmill_cgroups(core_cpu_shares, apps_cpu_shares, core_cpuset_cpus, apps_cpuset_cpus, core_memory, apps_memory, cgroup_prefix): """This is the core cgroup setup. Should be applied to a cleaned env. """ # generate core/apps group name: treadmill, treadmill.slice etc core_group = core_group_name(cgroup_prefix) apps_group = apps_group_name(cgroup_prefix) # CPU and CPU Accounting (typically joined). create('cpu', core_group) create('cpu', apps_group) create('cpuacct', core_group) create('cpuacct', apps_group) if core_cpu_shares is not None: cgroups.set_value('cpu', core_group, 'cpu.shares', core_cpu_shares) cgroups.set_value('cpu', apps_group, 'cpu.shares', apps_cpu_shares) # CPU sets create('cpuset', core_group) create('cpuset', apps_group) cgroups.inherit_value('cpuset', core_group, 'cpuset.mems') cgroups.inherit_value('cpuset', apps_group, 'cpuset.mems') # cgroup combines duplicate cores automatically if core_cpuset_cpus is not None: cgroups.set_value('cpuset', core_group, 'cpuset.cpus', core_cpuset_cpus) cgroups.set_value('cpuset', apps_group, 'cpuset.cpus', apps_cpuset_cpus) else: cgroups.inherit_value('cpuset', core_group, 'cpuset.cpus') cgroups.inherit_value('cpuset', apps_group, 'cpuset.cpus') # Memory create('memory', core_group) create('memory', apps_group) if core_memory is not None: set_memory_hardlimit(core_group, core_memory) cgroups.set_value('memory', core_group, 'memory.soft_limit_in_bytes', core_memory) set_memory_hardlimit(apps_group, apps_memory) cgroups.set_value('memory', apps_group, 'memory.soft_limit_in_bytes', apps_memory)
def on_create_request(self, rsrc_id, rsrc_data): instance_id = rsrc_id memory_limit = rsrc_data['memory'] cpu_limit = rsrc_data['cpu'] apps_group = cgutils.apps_group_name(self._cgroup_prefix) cgrp = os.path.join(apps_group, instance_id) with lc.LogContext(_LOGGER, rsrc_id, adapter_cls=lc.ContainerAdapter) as log: log.info('Creating cgroups: %s:%s', self.SUBSYSTEMS, cgrp) for subsystem in self.SUBSYSTEMS: cgutils.create(subsystem, cgrp) cgutils.create(subsystem, os.path.join(cgrp, 'services')) # blkio settings # cgroups.set_value('blkio', cgrp, 'blkio.weight', 100) # memory settings # self._register_oom_handler(cgrp, instance_id) cgroups.set_value('memory', cgrp, 'memory.soft_limit_in_bytes', memory_limit) # TODO: set hardlimit to app.memory and comment the # reset_memory block until proper solution for # cgroup race condition is implemented. cgutils.set_memory_hardlimit(cgrp, memory_limit) # expunged = cgutils.reset_memory_limit_in_bytes() # for expunged_uniq_name in expunged: # exp_app_dir = os.path.join(tm_env.apps_dir, # expunged_uniq_name) # with open(os.path.join(exp_app_dir, # 'services', 'finished'), 'w') as f: # f.write('oom') # exp_cgrp = os.path.join('treadmill', 'apps', # expunged_uniq_name) # cgutils.kill_apps_in_cgroup('memory', exp_cgrp, # delete_cgrp=False) # cpu settings # # Calculate the value of cpu shares for the app. # # [treadmill/apps/cpu.shares] = <total bogomips allocated to TM> # # [treadmill/apps/<app>/cpu.shares] = app.cpu * BMIPS_PER_CPU # app_cpu_pcnt = utils.cpu_units(cpu_limit) / 100. app_bogomips = app_cpu_pcnt * sysinfo.BMIPS_PER_CPU app_cpu_shares = int(app_bogomips) log.info('created in cpu:%s with %s shares', cgrp, app_cpu_shares) cgutils.set_cpu_shares(cgrp, app_cpu_shares) log.info('Inherit parent cpuset.cpus for %s', cgrp) cgroups.inherit_value('cpuset', cgrp, 'cpuset.cpus') log.info('Inherit parent cpuset.mems for %s', cgrp) cgroups.inherit_value('cpuset', cgrp, 'cpuset.mems') return {subsystem: cgrp for subsystem in self.SUBSYSTEMS}