普通文本  |  107行  |  3.68 KB

#    Copyright 2017-2017 ARM Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from bart.common.Utils import select_window

from test import LisaTest, experiment_test

WORKLOAD_DURATION_S = 5

REQUIRED_CPU_ACTIVE_TIME_PCT = 95

class HeavyLoadTest(LisaTest):
    """
    Test an EAS system under heavy load

    Runs N 100% RT-App threads where N is the number of CPUs, and checks that
    those tasks were spread across all CPUs in the system by asserting that all
    CPUs were fully utilized up until the first task completed.
    """

    test_conf = {
        'ftrace' : {
            'events' : ['cpu_idle', 'sched_switch'],
        },
        'modules' : ['cgroups'], # Required by freeze_userspace flag
    }

    experiments_conf = {
        "wloads" : {
            "n_heavy_tasks" : {
                "type" : "rt-app",
                "conf" : {
                    "class" : "profile",
                    "params" : {
                        "wmig" : {
                            "kind" : "Periodic",
                            "params" : {
                                "duty_cycle_pct": 100,
                                "duration_s": WORKLOAD_DURATION_S,
                            },
                            # Create one task for each cpu
                            "tasks" : "cpus",
                        },
                    },
                },
            },
        },
        "confs" : [{
            'tag' : 'energy_aware',
            'flags' : ['ftrace', 'freeze_userspace'],
            'sched_features' : 'ENERGY_AWARE',
        }]
    }

    @classmethod
    def setUpClass(cls, *args, **kwargs):
        super(HeavyLoadTest, cls).runExperiments(*args, **kwargs)

    @experiment_test
    def test_tasks_spread(self, experiment, tasks):
        trace = self.get_trace(experiment)
        start, _ = self.get_window(experiment)
        end = min(self.get_end_times(experiment).values())
        duration = end - start

        total_cpu_time = 0
        active_proportions = []
        for cpu, _ in enumerate(self.target.core_names):
            cpu_active = trace.getCPUActiveSignal(cpu)
            if cpu_active is None:
                raise RuntimeError(
                    "Couldn't get CPU-active signal. "
                    "Is the 'cpu_idle' ftrace event enabled in the kernel?")

            # Add extra events to cpu_active signal so that it matches the
            # window exactly
            new_index = sorted(cpu_active.index.tolist() + [start, end])
            cpu_active = cpu_active.reindex(new_index, method='ffill')

            active_time = trace.integrate_square_wave(cpu_active[start:end])
            active_proportions.append(active_time / duration)

        if any(a < (REQUIRED_CPU_ACTIVE_TIME_PCT / 100.)
               for a in active_proportions):

            proportions_str = ""
            for cpu, _ in enumerate(self.target.core_names):
                proportions_str += " {:3d} {:5.1f}%\n".format(
                    cpu, active_proportions[cpu]*100)

            raise AssertionError(
                "Some CPUs were less than {}% utilized\n"
                " CPU active proportions:\n{}".format(
                    REQUIRED_CPU_ACTIVE_TIME_PCT, proportions_str))