def format_affinity(self, affinity): if len(affinity) <= 4: return ",".join(str(a) for a in affinity) return ",".join( str(hex(a)) for a in procfs.hexbitmask(affinity, self.get_nr_cpus()))
def run(self): changed = False if self.dialog.run() == gtk.RESPONSE_OK: new_policy = self.sched_policy.get_active() new_prio = int(self.sched_pri.get_value()) new_affinity = self.affinity.get_text() irq_re = tuna.threaded_irq_re(self.irq) pids = self.ps.find_by_regex(irq_re) if pids: if gui.thread_set_attributes(self.ps[pids[0]], new_policy, new_prio, new_affinity, self.irqs.nr_cpus): changed = True try: new_affinity = [int(a) for a in new_affinity.split(",")] except: try: new_affinity = tuna.cpustring_to_list(new_affinity) except: new_affinity = procfs.bitmasklist(new_affinity, self.irqs.nr_cpus) new_affinity.sort() curr_affinity = self.irqs[self.irq]["affinity"] if curr_affinity != new_affinity: tuna.set_irq_affinity( self.irq, procfs.hexbitmask(new_affinity, self.irqs.nr_cpus)) changed = True self.dialog.destroy() return changed
def show(irqs, ps): irq_list = [] for sirq in irqs.keys(): try: irq_list.append(int(sirq)) except: continue irq_list.sort() nics = ethtool.get_active_devices() for irq in irq_list: info = irqs[irq] pids = ps.find_by_name("IRQ-%d" % irq) if pids: pid = pids[0] thread_affinity_list = schedutils.get_affinity(pid) if len(thread_affinity_list) <= 4: thread_affinity = ",".join("%s" % a for a in thread_affinity_list) else: thread_affinity = ",".join("0x%x" % a for a in procfs.hexbitmask(schedutils.get_affinity(pid), irqs.nr_cpus)) rtprio = int(ps[pid]["stat"]["rt_priority"]) else: pid = -1 rtprio = -1 thread_affinity = "" try: irq_affinity_list = info["affinity"] if len(irq_affinity_list) <= 4: irq_affinity = ",".join("%s" % a for a in irq_affinity_list) else: irq_affinity = ",".join("0x%x" % a for a in procfs.hexbitmask(irq_affinity_list, irqs.nr_cpus)) except: irq_affinity = "" events = reduce(lambda a, b: a + b, info["cpu"]) users = info["users"] for u in users: if u in nics: users[users.index(u)] = "%s(%s)" % (u, ethtool.get_module(u)) print "%5d: %5d %5d %11d %8s %8s %s" % (irq, pid, rtprio, events, thread_affinity, irq_affinity, ",".join(users))
def move_irqs_to_cpu(cpus, irq_list, spread = False): changed = 0 unprocessed = [] cpu_idx = 0 nr_cpus = len(cpus) new_affinity = cpus last_cpu = max(cpus) + 1 irqs = None ps = procfs.pidstats() for i in irq_list: try: irq = int(i) except: if not irqs: irqs = procfs.interrupts() irq = irqs.find_by_user(i) if not irq: unprocessed.append(i) continue try: irq = int(irq) except: unprocessed.append(i) continue if spread: new_affinity = [cpus[cpu_idx]] cpu_idx += 1 if cpu_idx == nr_cpus: cpu_idx = 0 bitmasklist = procfs.hexbitmask(new_affinity, last_cpu) set_irq_affinity(irq, bitmasklist) changed += 1 pid = ps.find_by_name("IRQ-%d" % irq) if pid: pid = int(pid[0]) try: schedutils.set_affinity(pid, new_affinity) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: unprocessed.append(i) changed -= 1 continue raise e return (changed, unprocessed)
def show(ps, cpuinfo, irqs): ps_list = [] for pid in ps.keys(): if schedutils.get_scheduler(pid) == 0: continue ps_list.append(pid) ps_list.sort() nics = ethtool.get_active_devices() for pid in ps_list: thread_affinity_list = schedutils.get_affinity(pid) if len(thread_affinity_list) <= 4: thread_affinity = ",".join(str(a) for a in thread_affinity_list) else: thread_affinity = ",".join( str(hex(a)) for a in procfs.hexbitmask( schedutils.get_affinity(pid), cpuinfo.nr_cpus)) sched = schedutils.schedstr(schedutils.get_scheduler(pid))[6:] rtprio = int(ps[pid]["stat"]["rt_priority"]) cmd = ps[pid]["stat"]["comm"] users = "" if cmd[:4] == "IRQ-": try: users = irqs[cmd[4:]]["users"] for u in users: if u in nics: users[users.index( u)] = "%s(%s)" % (u, ethtool.get_module(u)) users = ",".join(users) except: users = "Not found in /proc/interrupts!" try: voluntary_ctxt_switches = int( ps[pid]["status"]["voluntary_ctxt_switches"]) nonvoluntary_ctxt_switches = int( ps[pid]["status"]["nonvoluntary_ctxt_switches"]) except: voluntary_ctxt_switches = -1 nonvoluntary_ctxt_switches = -1 print "%5d %6s %5d %8s %9d %12s %15s %s" % ( pid, sched, rtprio, thread_affinity, voluntary_ctxt_switches, nonvoluntary_ctxt_switches, cmd, users)
def restore_cpu(self): if not (self.previous_pid_affinities or \ self.previous_irq_affinities): return affinities = self.previous_pid_affinities for pid in affinities.keys(): try: schedutils.set_affinity(pid, affinities[pid]) except: pass affinities = self.previous_irq_affinities for irq in affinities.keys(): tuna.set_irq_affinity( int(irq), procfs.hexbitmask(affinities[irq], self.cpus.nr_cpus)) self.previous_pid_affinities = None self.previous_irq_affinities = None
def restore_cpu(self): if not (self.previous_pid_affinities or \ self.previous_irq_affinities): return affinities = self.previous_pid_affinities for pid in affinities.keys(): try: schedutils.set_affinity(pid, affinities[pid]) except: pass affinities = self.previous_irq_affinities for irq in affinities.keys(): tuna.set_irq_affinity(int(irq), procfs.hexbitmask(affinities[irq], self.cpus.nr_cpus)) self.previous_pid_affinities = None self.previous_irq_affinities = None
def show(ps, cpuinfo, irqs): ps_list = [] for pid in ps.keys(): if schedutils.get_scheduler(pid) == 0: continue ps_list.append(pid) ps_list.sort() nics = ethtool.get_active_devices() for pid in ps_list: thread_affinity_list = schedutils.get_affinity(pid) if len(thread_affinity_list) <= 4: thread_affinity = ",".join(str(a) for a in thread_affinity_list) else: thread_affinity = ",".join(str(hex(a)) for a in procfs.hexbitmask(schedutils.get_affinity(pid), cpuinfo.nr_cpus)) sched = schedutils.schedstr(schedutils.get_scheduler(pid))[6:] rtprio = int(ps[pid]["stat"]["rt_priority"]) cmd = ps[pid]["stat"]["comm"] users = "" if cmd[:4] == "IRQ-": try: users = irqs[cmd[4:]]["users"] for u in users: if u in nics: users[users.index(u)] = "%s(%s)" % (u, ethtool.get_module(u)) users = ",".join(users) except: users = "Not found in /proc/interrupts!" try: voluntary_ctxt_switches = int(ps[pid]["status"]["voluntary_ctxt_switches"]) nonvoluntary_ctxt_switches = int(ps[pid]["status"]["nonvoluntary_ctxt_switches"]) except: voluntary_ctxt_switches = -1 nonvoluntary_ctxt_switches = -1 print "%5d %6s %5d %8s %9d %12s %15s %s" % (pid, sched, rtprio, thread_affinity, voluntary_ctxt_switches, nonvoluntary_ctxt_switches, cmd, users)
def run(self): changed = False if self.dialog.run() == gtk.RESPONSE_OK: new_policy = self.sched_policy.get_active() new_prio = int(self.sched_pri.get_value()) new_affinity = self.affinity.get_text() irq_re = tuna.threaded_irq_re(self.irq) pids = self.ps.find_by_regex(irq_re) if pids: if gui.thread_set_attributes(self.ps[pids[0]], new_policy, new_prio, new_affinity, self.irqs.nr_cpus): changed = True try: new_affinity = [ int(a) for a in new_affinity.split(",") ] except: try: new_affinity = tuna.cpustring_to_list(new_affinity) except: new_affinity = procfs.bitmasklist(new_affinity, self.irqs.nr_cpus) new_affinity.sort() curr_affinity = self.irqs[self.irq]["affinity"] if curr_affinity != new_affinity: tuna.set_irq_affinity(self.irq, procfs.hexbitmask(new_affinity, self.irqs.nr_cpus)) changed = True self.dialog.destroy() return changed
def generate_rtgroups(filename, kthreads, nr_cpus): f = file(filename, "w") f.write('''# Generated by tuna # # Use it with rtctl: # # rtctl --file %s reset # # Please use 'man rtctl' for more operations # # Associate processes into named groups with default priority and # scheduling policy. # # Format is: <groupname>:<sched>:<prio>:<regex> # # groupname must start at beginning of line. # sched must be one of: 'f' (fifo) # 'b' (batch) # 'r' (round-robin) # 'o' (other) # '*' (leave alone) # regex is an awk regex # # The regex is matched against process names as printed by "ps -eo cmd". ''' % filename) f.write("kthreads:*:1:*:\[.*\]$\n\n") per_cpu_kthreads = [] names = kthreads.keys() names.sort() for name in names: kt = kthreads[name] try: idx = name.index("/") common = name[:idx] if common in per_cpu_kthreads: continue per_cpu_kthreads.append(common) name = common if common[:5] == "sirq-": common = "(sirq|softirq)" + common[4:] elif common[:8] == "softirq-": common = "(sirq|softirq)" + common[7:] name = "s" + name[4:] regex = common + "\/.*" except: idx = 0 regex = name pass if kt.percpu or idx != 0 or name == "posix_cpu_timer": # Don't mess with workqueues, etc # posix_cpu_timer is too long and doesn't # have PF_THREAD_BOUND in its per process # flags... mask = "*" else: mask = ",".join([hex(a) for a in \ procfs.hexbitmask(kt.affinity, nr_cpus)]) f.write("%s:%c:%d:%s:\[%s\]$\n" % (name, schedutils.schedstr(kt.policy)[6].lower(), kt.rtprio, mask, regex)) f.close()
def include_cpus(cpus, nr_cpus): ps = procfs.pidstats() ps.reload_threads() previous_pid_affinities = {} for pid in ps.keys(): if iskthread(pid): continue try: affinity = schedutils.get_affinity(pid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if set(affinity).intersection(set(cpus)) != set(cpus): previous_pid_affinities[pid] = copy.copy(affinity) affinity = list(set(affinity + cpus)) try: schedutils.set_affinity(pid, affinity) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if not ps[pid].has_key("threads"): continue threads = ps[pid]["threads"] for tid in threads.keys(): if iskthread(tid): continue try: affinity = schedutils.get_affinity(tid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if set(affinity).intersection(set(cpus)) != set(cpus): previous_pid_affinities[tid] = copy.copy(affinity) affinity = list(set(affinity + cpus)) try: schedutils.set_affinity(tid, affinity) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e del ps # Now include it in IRQs too irqs = procfs.interrupts() previous_irq_affinities = {} for irq in irqs.keys(): # LOC, NMI, TLB, etc if not irqs[irq].has_key("affinity"): continue affinity = irqs[irq]["affinity"] if set(affinity).intersection(set(cpus)) != set(cpus): previous_irq_affinities[irq] = copy.copy(affinity) affinity = list(set(affinity + cpus)) set_irq_affinity(int(irq), procfs.hexbitmask(affinity, nr_cpus)) return (previous_pid_affinities, previous_irq_affinities)
def move_threads_to_cpu(cpus, pid_list, set_affinity_warning = None, spread = False): changed = False ps = procfs.pidstats() cpu_idx = 0 nr_cpus = len(cpus) new_affinity = cpus last_cpu = max(cpus) + 1 for pid in pid_list: if spread: new_affinity = [cpus[cpu_idx]] cpu_idx += 1 if cpu_idx == nr_cpus: cpu_idx = 0 try: try: curr_affinity = schedutils.get_affinity(pid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: # 'No such process' continue curr_affinity = None raise e if set(curr_affinity) != set(new_affinity): try: schedutils.set_affinity(pid, new_affinity) curr_affinity = schedutils.get_affinity(pid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: # 'No such process' continue curr_affinity == None raise e if set(curr_affinity) == set(new_affinity): changed = True if is_hardirq_handler(ps, pid): try: irq = int(ps[pid]["stat"]["comm"][4:]) bitmasklist = procfs.hexbitmask(new_affinity, last_cpu) set_irq_affinity(irq, bitmasklist) except: pass elif set_affinity_warning: set_affinity_warning(pid, new_affinity) else: print "move_threads_to_cpu: %s " % \ (_("could not change %(pid)d affinity to %(new_affinity)s") % \ {'pid':pid, 'new_affinity':new_affinity}) # See if this is the thread group leader if not ps.has_key(pid): continue threads = procfs.pidstats("/proc/%d/task" % pid) for tid in threads.keys(): try: curr_affinity = schedutils.get_affinity(tid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if set(curr_affinity) != set(new_affinity): try: schedutils.set_affinity(tid, new_affinity) curr_affinity = schedutils.get_affinity(tid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if set(curr_affinity) == set(new_affinity): changed = True elif set_affinity_warning: set_affinity_warning(tid, new_affinity) else: print "move_threads_to_cpu: %s " % \ (_("could not change %(pid)d affinity to %(new_affinity)s") % \ {'pid':pid, 'new_affinity':new_affinity}) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: # process died continue raise e return changed
def format_affinity(affinity): if len(affinity) <= 4: return ",".join(str(a) for a in affinity) return ",".join(str(hex(a)) for a in procfs.hexbitmask(affinity, get_nr_cpus()))
def isolate_cpus(cpus, nr_cpus): ps = procfs.pidstats() ps.reload_threads() previous_pid_affinities = {} for pid in ps.keys(): if cannot_set_affinity(ps, pid): continue try: affinity = schedutils.get_affinity(pid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if set(affinity).intersection(set(cpus)): previous_pid_affinities[pid] = copy.copy(affinity) affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) try: schedutils.set_affinity(pid, affinity) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if not ps[pid].has_key("threads"): continue threads = ps[pid]["threads"] for tid in threads.keys(): if cannot_set_thread_affinity(ps, pid, tid): continue try: affinity = schedutils.get_affinity(tid) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e if set(affinity).intersection(set(cpus)): previous_pid_affinities[tid] = copy.copy(affinity) affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) try: schedutils.set_affinity(tid, affinity) except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError if e[0] == 3: continue raise e del ps # Now isolate it from IRQs too irqs = procfs.interrupts() previous_irq_affinities = {} for irq in irqs.keys(): # LOC, NMI, TLB, etc if not irqs[irq].has_key("affinity"): continue affinity = irqs[irq]["affinity"] if set(affinity).intersection(set(cpus)): previous_irq_affinities[irq] = copy.copy(affinity) affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) set_irq_affinity(int(irq), procfs.hexbitmask(affinity, nr_cpus)) affinity = parse_irq_affinity_filename("default_smp_affinity", nr_cpus) affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) set_irq_affinity_filename("default_smp_affinity", procfs.hexbitmask(affinity, nr_cpus)) return (previous_pid_affinities, previous_irq_affinities)