Beispiel #1
0
    def show(self):
        if not self.have_device:
            return

        for cpu in self.system.cpus:
            if not self.read_cpu(cpu):
                break

        enabled = set()
        disabled = set()
        for cpu, state in self.cpu_states.items():
            if state:
                enabled.add(cpu)
            else:
                disabled.add(cpu)

        text = []
        if enabled:
            text.append('CPU %s: enabled' % format_cpu_list(enabled))
        if disabled:
            text.append('CPU %s: disabled' % format_cpu_list(disabled))
        if text:
            self.log_state(', '.join(text))

        self.tuned_for_benchmarks = (not enabled)
        if enabled:
            self.advice('Disable Turbo Boost on CPU %s to get more reliable '
                        'CPU frequency' % format_cpu_list(enabled))
Beispiel #2
0
 def test_format_cpu_list(self):
     self.assertEqual(cpu_utils.format_cpu_list([0]),
                      '0')
     self.assertEqual(cpu_utils.format_cpu_list([0, 1, 5, 6]),
                      '0-1,5-6')
     self.assertEqual(cpu_utils.format_cpu_list([1, 3, 7]),
                      '1,3,7')
Beispiel #3
0
    def _cpu_affinity(self):
        cpus = self.args.affinity
        if not cpus:
            # --affinity option is not set: detect isolated CPUs
            isolated = True
            cpus = get_isolated_cpus()
            if not cpus:
                # no isolated CPUs or unable to get the isolated CPUs
                return
        else:
            isolated = False
            cpus = parse_cpu_list(cpus)

        if set_cpu_affinity(cpus):
            if self.args.verbose:
                if isolated:
                    text = ("Pin process to isolated CPUs: %s"
                            % format_cpu_list(cpus))
                else:
                    text = ("Pin process to CPUs: %s"
                            % format_cpu_list(cpus))
                print(text)

            if isolated:
                self.args.affinity = format_cpu_list(cpus)
        else:
            if not isolated:
                print("ERROR: CPU affinity not available.", file=sys.stderr)
                print("Use Python 3.3 or newer, or install psutil dependency")
                sys.exit(1)
            elif not self.args.quiet:
                print("WARNING: unable to pin worker processes to "
                      "isolated CPUs, CPU affinity not available")
                print("Use Python 3.3 or newer, or install psutil dependency")
Beispiel #4
0
    def show(self):
        if not self.have_device:
            return

        for cpu in self.system.cpus:
            if not self.read_cpu(cpu):
                break

        enabled = set()
        disabled = set()
        for cpu, state in self.cpu_states.items():
            if state:
                enabled.add(cpu)
            else:
                disabled.add(cpu)

        text = []
        if enabled:
            text.append('CPU %s: enabled' % format_cpu_list(enabled))
        if disabled:
            text.append('CPU %s: disabled' % format_cpu_list(disabled))
        if text:
            self.log_state(', '.join(text))

        self.tuned_for_benchmarks = (not enabled)
        if enabled:
            self.advice('Disable Turbo Boost on CPU %s to get more reliable '
                        'CPU frequency' % format_cpu_list(enabled))
Beispiel #5
0
    def write_irqs(self, new_cpus):
        affinity = self.read_irqs_affinity()
        modified = []
        for irq in self.get_irqs():
            if self.permission_error:
                break

            cpus = affinity.get(irq)
            if new_cpus == cpus:
                continue

            if self.write_irq(irq, new_cpus):
                modified.append(irq)

        if modified:
            self.log_action("Set affinity of IRQ %s to CPU %s"
                            % (format_cpu_list(modified), format_cpu_list(new_cpus)))
Beispiel #6
0
    def show(self):
        irqbalance_active = self.read_irqbalance_state()
        if irqbalance_active is not None:
            state = 'active' if irqbalance_active else 'inactive'
            self.log_state("irqbalance service: %s" % state)

        default_smp_affinity = self.read_default_affinity()
        if default_smp_affinity:
            self.log_state("Default IRQ affinity: CPU %s"
                           % format_cpu_list(default_smp_affinity))

        irq_affinity = self.read_irqs_affinity()
        if irq_affinity:
            infos = {irq: 'CPU %s' % format_cpu_list(cpus)
                     for irq, cpus in irq_affinity.items()}
            infos = format_cpu_infos(infos)
            infos = ['IRQ %s' % info for info in infos]
            self.log_state('IRQ affinity: %s' % '; '.join(infos))
Beispiel #7
0
    def show(self):
        irqbalance_active = self.read_irqbalance_state()
        if irqbalance_active is not None:
            state = 'active' if irqbalance_active else 'inactive'
            self.log_state("irqbalance service: %s" % state)

        default_smp_affinity = self.read_default_affinity()
        if default_smp_affinity:
            self.log_state("Default IRQ affinity: CPU %s"
                           % format_cpu_list(default_smp_affinity))

        irq_affinity = self.read_irqs_affinity()
        if irq_affinity:
            infos = {irq: 'CPU %s' % format_cpu_list(cpus)
                     for irq, cpus in irq_affinity.items()}
            infos = format_cpu_infos(infos)
            infos = ['IRQ %s' % info for info in infos]
            self.log_state('IRQ affinity: %s' % '; '.join(infos))
Beispiel #8
0
 def check_isolcpus(self):
     isolated = get_isolated_cpus()
     if isolated:
         self.log_state('Isolated CPUs (%s/%s): %s'
                        % (len(isolated), self.ncpu,
                           format_cpu_list(isolated)))
     elif self.ncpu > 1:
         self.log_state('No CPU is isolated')
         self.advice('Use isolcpus=<cpu list> kernel parameter '
                     'to isolate CPUs')
Beispiel #9
0
 def check_rcu_nocbs(self):
     rcu_nocbs = self.read_rcu_nocbs()
     if rcu_nocbs:
         self.log_state('RCU disabled on CPUs (%s/%s): %s'
                        % (len(rcu_nocbs), self.ncpu,
                           format_cpu_list(rcu_nocbs)))
     elif self.ncpu > 1:
         self.advice('Use rcu_nocbs=<cpu list> kernel parameter '
                     '(with isolcpus) to not schedule RCU '
                     'on isolated CPUs')
Beispiel #10
0
 def check_rcu_nocbs(self):
     rcu_nocbs = self.read_rcu_nocbs()
     if rcu_nocbs:
         self.log_state('RCU disabled on CPUs (%s/%s): %s'
                        % (len(rcu_nocbs), self.ncpu,
                           format_cpu_list(rcu_nocbs)))
     elif self.ncpu > 1:
         self.advice('Use rcu_nocbs=<cpu list> kernel parameter '
                     '(with isolcpus) to not schedule RCU '
                     'on isolated CPUs')
Beispiel #11
0
 def check_isolcpus(self):
     isolated = get_isolated_cpus()
     if isolated:
         self.log_state('Isolated CPUs (%s/%s): %s'
                        % (len(isolated), self.ncpu,
                           format_cpu_list(isolated)))
     elif self.ncpu > 1:
         self.log_state('No CPU is isolated')
         self.advice('Use isolcpus=<cpu list> kernel parameter '
                     'to isolate CPUs')
Beispiel #12
0
def collect_cpu_affinity(metadata, cpu_affinity, cpu_count):
    if not cpu_affinity:
        return
    if not cpu_count:
        return

    # CPU affinity
    if set(cpu_affinity) == set(range(cpu_count)):
        return

    metadata['cpu_affinity'] = format_cpu_list(cpu_affinity)
Beispiel #13
0
    def write(self, tune):
        modified = []
        for cpu in self.system.cpus:
            if self.write_cpu(cpu, tune):
                modified.append(cpu)
            if self.permission_error:
                break

        if modified:
            cpus = format_cpu_list(modified)
            if tune:
                action = "set to the maximum frequency"
            else:
                action = "reset to the minimum frequency"
            self.log_action("Minimum frequency of CPU %s %s" % (cpus, action))
Beispiel #14
0
    def write_default(self, new_affinity):
        default_smp_affinity = self.read_default_affinity()
        if new_affinity == default_smp_affinity:
            return

        mask = format_cpus_as_mask(new_affinity)
        try:
            write_text(self.default_affinity_path, mask)
        except IOError as exc:
            self.check_permission_error(exc)
            self.error("Failed to write %r into %s: %s"
                       % (mask, self.default_affinity_path, exc))
        else:
            self.log_action("Set default affinity to CPU %s"
                            % format_cpu_list(new_affinity))
Beispiel #15
0
    def write(self, tune):
        modified = []
        for cpu in self.system.cpus:
            if self.write_cpu(cpu, tune):
                modified.append(cpu)
            if self.permission_error:
                break

        if modified:
            cpus = format_cpu_list(modified)
            if tune:
                action = "set to the maximum frequency"
            else:
                action = "reset to the minimum frequency"
            self.log_action("Minimum frequency of CPU %s %s" % (cpus, action))
Beispiel #16
0
    def write_default(self, new_affinity):
        default_smp_affinity = self.read_default_affinity()
        if new_affinity == default_smp_affinity:
            return

        mask = format_cpus_as_mask(new_affinity)
        try:
            write_text(self.default_affinity_path, mask)
        except IOError as exc:
            self.check_permission_error(exc)
            self.error("Failed to write %r into %s: %s"
                       % (mask, self.default_affinity_path, exc))
        else:
            self.log_action("Set default affinity to CPU %s"
                            % format_cpu_list(new_affinity))
Beispiel #17
0
    def show(self):
        nohz_full = self.read_first_line(sysfs_path('devices/system/cpu/nohz_full'))
        if not nohz_full:
            return

        nohz_full = parse_cpu_list(nohz_full)
        if not nohz_full:
            return

        used = set(self.system.cpus) | set(nohz_full)
        if not used:
            return

        self.advice("WARNING: nohz_full is enabled on CPUs %s which use the "
                    "intel_pstate driver, whereas intel_pstate is incompatible "
                    "with nohz_full"
                    % format_cpu_list(used))
        self.advice("See https://bugzilla.redhat.com/show_bug.cgi?id=1378529")
        self.tuned_for_benchmarks = False
Beispiel #18
0
    def init(self, args):
        if not self.operations:
            print("WARNING: no operation available for your platform")
            sys.exit()

        self.logical_cpu_count = get_logical_cpu_count()
        if not self.logical_cpu_count:
            print("ERROR: failed to get the number of logical CPUs")
            sys.exit(1)

        isolated = get_isolated_cpus()
        if isolated:
            self.cpus = tuple(isolated)
        elif args.affinity:
            self.cpus = tuple(args.affinity)
        else:
            self.cpus = tuple(range(self.logical_cpu_count))
        # The list of cpus must be sorted to avoid useless write in operations
        assert sorted(self.cpus) == list(self.cpus)

        self.log_state("CPU: use %s logical CPUs: %s"
                       % (len(self.cpus), format_cpu_list(self.cpus)))
Beispiel #19
0
    def init(self, args):
        if not self.operations:
            print("WARNING: no operation available for your platform")
            sys.exit()

        self.logical_cpu_count = get_logical_cpu_count()
        if not self.logical_cpu_count:
            print("ERROR: failed to get the number of logical CPUs")
            sys.exit(1)

        isolated = get_isolated_cpus()
        if isolated:
            self.cpus = tuple(isolated)
        elif args.affinity:
            self.cpus = tuple(args.affinity)
        else:
            self.cpus = tuple(range(self.logical_cpu_count))
        # The list of cpus must be sorted to avoid useless write in operations
        assert sorted(self.cpus) == list(self.cpus)

        self.log_state("CPU: use %s logical CPUs: %s"
                       % (len(self.cpus), format_cpu_list(self.cpus)))
Beispiel #20
0
 def test_format_cpu_list(self):
     self.assertEqual(cpu_utils.format_cpu_list([0]), '0')
     self.assertEqual(cpu_utils.format_cpu_list([0, 1, 5, 6]), '0-1,5-6')
     self.assertEqual(cpu_utils.format_cpu_list([1, 3, 7]), '1,3,7')