예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
    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}