def run_command(cmd, policy, rtprio, cpu_list): newpid = os.fork() if newpid == 0: cmd_list = shlex.split(cmd) pid = os.getpid() if rtprio: try: thread_set_priority(pid, policy, rtprio) except (SystemError, OSError) as err: print "tuna: %s" % err sys.exit(2) if cpu_list: try: schedutils.set_affinity(pid, cpu_list) except (SystemError, OSError) as err: print "tuna: %s" % err sys.exit(2) try: os.execvp(cmd_list[0], cmd_list) except (SystemError, OSError) as err: print "tuna: %s" % err sys.exit(2) else: os.waitpid(newpid, 0);
def run_test(args): n = args['n'] proc = map(lambda a: LoadProcess("../build/reg_to_rusage_load_float_mult_op", str(args['l'])), range(n)) if args['a'] == 'set': from multiprocessing import cpu_count from schedutils import set_affinity cpus = cpu_count() i = 0 for p in proc: set_affinity(p.pid, [i]) i += 1 try: the_loop(proc, args) except Exception as e: print "Error:", e finally: from os import killpg from signal import SIGTERM from datetime import datetime start_time = min(map(lambda p: p.start_time, proc)) end_time = datetime.now() print "Configuration:", args print "Total running time:", end_time - start_time print "Killing processes..." map(lambda p: killpg(p.process.pid, SIGTERM), proc) print "Joining threads..." map(lambda p: p.thread.join(), proc) ret = end_time - start_time ret = ret.days*24*60*60 + ret.seconds + ret.microseconds*(10**-6) return ret
def _set_affinity2(self, pid, affinity): try: schedutils.set_affinity(pid, affinity) # Workaround for old python-schedutils which incorrectly raised error except (SystemError, OSError) as e: if e[0] == 3: log.debug("Unable to set affinity for PID %s, the task vanished." % pid) return False log.error("unable to set affinity '%s' for PID '%s': %s" % (str(affinity), str(pid), e)) return False return True
def main(): from argparse import ArgumentParser from time import time parser = ArgumentParser() parser.add_argument("-n", nargs=1, default=[1], type=int, help="Number of processes to start") parser.add_argument("-a", nargs=1, default=["dont_set"], choices=["dont_set", "set"], help="Affinity setting") parser.add_argument("-max", nargs=1, default=[0.9], type=float, help="The maximum load to set on processes") parser.add_argument("-min", nargs=1, default=[0.1], type=float, help="The minium load to set on processes") parser.add_argument( "-shift", nargs=1, default=[0.0], type=float, help="The phase shift in the sine between processes" ) parser.add_argument( "-o", nargs=1, default=[0], type=int, help="Total number of operations to perform before exiting" ) args = parser.parse_args() n = args.n[0] proc_start_time = time() proc = map( lambda a: LoadProcess( "./a.out", str(args.max[0]), str(args.min[0]), str(a * args.shift[0]), str(proc_start_time) ), range(n), ) if args.a == "set": from multiprocessing import cpu_count from schedutils import set_affinity cpus = cpu_count() i = 0 for p in proc: set_affinity(p.pid, [i]) i += 1 try: the_loop(proc, args) finally: from os import killpg from signal import SIGTERM from datetime import datetime start_time = min(map(lambda p: p.start_time, proc)) end_time = datetime.now() print "Configuration:", args print "Total running time:", end_time - start_time print "Killing processes..." map(lambda p: killpg(p.process.pid, SIGTERM), proc)
def change_settings(pid, affinity, cpu_list_mode): if cpu_list_mode: try: affinity = [int(a) for a in affinity.split(",")] except: affinity = cpustring_to_list(affinity) else: affinity = bitmasklist(affinity) try: schedutils.set_affinity(pid, affinity) except SystemError, err: print "sched_setaffinity: %s" % err[1] print "failed to set pid %d's affinity" % pid
def change_settings(pid, affinity, cpu_list_mode): if cpu_list_mode: try: affinity = [ int(a) for a in affinity.split(",") ] except: affinity = cpustring_to_list(affinity) else: affinity = bitmasklist(affinity) try: schedutils.set_affinity(pid, affinity) except SystemError, err: print "sched_setaffinity: %s" % err[1] print "failed to set pid %d's affinity" % pid
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 _set_affinity(self, pid, affinity): log.debug("Setting CPU affinity of PID %d to '%s'." % (pid, affinity)) try: schedutils.set_affinity(pid, affinity) return True # Workaround for old python-schedutils (pre-0.4) which # incorrectly raised SystemError instead of OSError except (SystemError, OSError) as e: if hasattr(e, "errno") and e.errno == errno.ESRCH: log.debug("Failed to set affinity of PID %d, the task vanished." % pid) else: res = self._affinity_changeable(pid) if res == 1 or res == -2: log.error("Failed to set affinity of PID %d to '%s': %s" % (pid, affinity, e)) return False
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 run_test(args): n = args['n'] proc = map( lambda a: LoadProcess("../build/reg_to_rusage_load_float_mult_op", str(args['l'])), range(n)) if args['a'] == 'set': from multiprocessing import cpu_count from schedutils import set_affinity cpus = cpu_count() i = 0 for p in proc: set_affinity(p.pid, [i]) i += 1 try: the_loop(proc, args) except Exception as e: print "Error:", e finally: from os import killpg from signal import SIGTERM from datetime import datetime start_time = min(map(lambda p: p.start_time, proc)) end_time = datetime.now() print "Configuration:", args print "Total running time:", end_time - start_time print "Killing processes..." map(lambda p: killpg(p.process.pid, SIGTERM), proc) print "Joining threads..." map(lambda p: p.thread.join(), proc) ret = end_time - start_time ret = ret.days * 24 * 60 * 60 + ret.seconds + ret.microseconds * (10** -6) return ret
def main(): from argparse import ArgumentParser from time import time parser = ArgumentParser() parser.add_argument('-n', nargs=1, default=[1], type=int, help="Number of processes to start") parser.add_argument('-a', nargs=1, default=['dont_set'], choices=['dont_set', 'set'], help="Affinity setting") parser.add_argument('-max', nargs=1, default=[0.9], type=float, help="The maximum load to set on processes") parser.add_argument('-min', nargs=1, default=[0.1], type=float, help="The minium load to set on processes") parser.add_argument('-shift', nargs=1, default=[0.0], type=float, help="The phase shift in the sine between processes") parser.add_argument( '-o', nargs=1, default=[0], type=int, help="Total number of operations to perform before exiting") args = parser.parse_args() n = args.n[0] proc_start_time = time() proc = map( lambda a: LoadProcess("./a.out", str(args.max[0]), str(args.min[0]), str(a * args.shift[0]), str(proc_start_time)), range(n)) if args.a == 'set': from multiprocessing import cpu_count from schedutils import set_affinity cpus = cpu_count() i = 0 for p in proc: set_affinity(p.pid, [i]) i += 1 try: the_loop(proc, args) finally: from os import killpg from signal import SIGTERM from datetime import datetime start_time = min(map(lambda p: p.start_time, proc)) end_time = datetime.now() print "Configuration:", args print "Total running time:", end_time - start_time print "Killing processes..." map(lambda p: killpg(p.process.pid, SIGTERM), proc)
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 thread_set_attributes(pid_info, new_policy, new_prio, new_affinity, nr_cpus): pid = pid_info.pid changed = False curr_policy = schedutils.get_scheduler(pid) curr_prio = int(pid_info["stat"]["rt_priority"]) if new_policy == schedutils.SCHED_OTHER: new_prio = 0 if curr_policy != new_policy or curr_prio != new_prio: try: schedutils.set_scheduler(pid, new_policy, new_prio) except: dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _("Invalid parameters!")) dialog.run() dialog.destroy() return False curr_policy = schedutils.get_scheduler(pid) if curr_policy != new_policy: print _("couldn't change pid %(pid)d from %(cpol)s(%(cpri)d) to %(npol)s(%(npri)d)!") % \ { 'pid': pid, 'cpol': schedutils.schedstr(curr_policy), 'cpri': curr_prio, 'npol': schedutils.schedstr(new_policy), 'npri': new_prio} else: changed = True 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: return False raise e 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, nr_cpus) new_affinity.sort() if curr_affinity != new_affinity: try: schedutils.set_affinity(pid, new_affinity) except: return invalid_affinity() 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: return False raise e if curr_affinity != new_affinity: print _("couldn't change pid %(pid)d from %(caff)s to %(naff)s!") % \ { 'pid':pid, 'caff':curr_affinity, 'naff':new_affinity } else: changed = True return changed
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)
def set_affinity(self, pid, affinity): schedutils.set_affinity(pid, affinity)
def thread_set_attributes(pid_info, new_policy, new_prio, new_affinity, nr_cpus): pid = pid_info.pid changed = False curr_policy = schedutils.get_scheduler(pid) curr_prio = int(pid_info["stat"]["rt_priority"]) if new_policy == schedutils.SCHED_OTHER: new_prio = 0 if curr_policy != new_policy or curr_prio != new_prio: try: schedutils.set_scheduler(pid, new_policy, new_prio) except: dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _("Invalid parameters!")) dialog.run() dialog.destroy() return False curr_policy = schedutils.get_scheduler(pid) if curr_policy != new_policy: print _("couldn't change pid %(pid)d from %(cpol)s(%(cpri)d) to %(npol)s(%(npri)d)!") % \ { 'pid': pid, 'cpol': schedutils.schedstr(curr_policy), 'cpri': curr_prio, 'npol': schedutils.schedstr(new_policy), 'npri': new_prio} else: changed = True 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: return False raise e 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, nr_cpus) new_affinity.sort() if curr_affinity != new_affinity: try: schedutils.set_affinity(pid, new_affinity) except: return invalid_affinity() 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: return False raise e if curr_affinity != new_affinity: print _("couldn't change pid %(pid)d from %(caff)s to %(naff)s!") % \ { 'pid':pid, 'caff':curr_affinity, 'naff':new_affinity } else: changed = True return changed