Example #1
0
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);
Example #2
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
Example #3
0
	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
Example #4
0
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)
Example #5
0
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
Example #6
0
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
Example #7
0
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
Example #9
0
	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
Example #10
0
    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
Example #11
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
Example #12
0
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)
Example #13
0
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)
Example #14
0
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
Example #15
0
File: util.py Project: bristot/tuna
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
Example #16
0
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)
Example #17
0
 def set_affinity(self, pid, affinity):
     schedutils.set_affinity(pid, affinity)
Example #18
0
File: util.py Project: noushi/tuna
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