def _configure_core_cgroups(service_name): """Configure service specific cgroups.""" group = os.path.join('treadmill/core', service_name) # create group directory for subsystem in ['memory', 'cpu', 'cpuacct', 'blkio']: _LOGGER.info('creating and joining: %s/%s', subsystem, group) cgutils.create(subsystem, group) cgroups.join(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)
def test_join(self): """Tests joining the cgroup.""" group = os.path.join('treadmill', 'apps', 'test1') cgroups.join('cpu', group, '1234') builtins.open.assert_called_once_with( '/cgroups/treadmill/apps/test1/tasks', 'w+') builtins.open().write.assert_called_once_with('1234')
def apply_cgroup_limits(tm_env, container_dir, manifest): """Configures cgroups and limits. :param tm_env: Treadmill application environment :type tm_env: `appenv.AppEnvironment` :param container_dir: Full path to the container :type container_dir: ``str`` :param manifest: App manifest. :type manifest: ``dict`` """ app = utils.to_obj(manifest) # Generate a unique name for the app unique_name = appcfg.app_unique_name(app) # Setup the service clients cgroup_client = tm_env.svc_cgroup.make_client( os.path.join(container_dir, 'cgroups')) localdisk_client = tm_env.svc_localdisk.make_client( os.path.join(container_dir, 'localdisk')) network_client = tm_env.svc_network.make_client( os.path.join(container_dir, 'network')) # Cgroup cgroup_req = { 'memory': app.memory, 'cpu': app.cpu, } # Local Disk localdisk_req = { 'size': app.disk, } # Network network_req = { 'environment': app.environment, } cgroup_client.put(unique_name, cgroup_req) localdisk_client.put(unique_name, localdisk_req) if not app.shared_network: network_client.put(unique_name, network_req) app_cgroups = cgroup_client.wait(unique_name) _LOGGER.info('Joining cgroups: %r', app_cgroups) for subsystem, cgrp in app_cgroups.items(): cgroups.join(subsystem, cgrp)
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 cgexec(into, subcommand): """execs command into given cgroup(s). """ cgrps = [cgrp.split(':') for cgrp in into] for (subsystem, path) in cgrps: pathplus = path.split('=') if len(pathplus) == 2: group = os.path.dirname(pathplus[0]) pseudofile = os.path.basename(pathplus[0]) value = pathplus[1] cgroups.set_value(subsystem, group, pseudofile, value) else: cgutils.create(subsystem, path) cgroups.join(subsystem, path) if subcommand: execargs = list(subcommand) utils.sane_execvp(execargs[0], execargs)
def _apply_cgroup_limits(app_cgroups): """Join cgroups.""" _LOGGER.info('Joining cgroups: %r', app_cgroups) for subsystem, cgrp in app_cgroups.items(): cgroups.join(subsystem, cgrp)