Update the spacing and style for tuna-cmd Signed-off-by: John Kacur <jka...@redhat.com> --- tuna-cmd.py | 1222 +++++++++++++++++++++++++-------------------------- 1 file changed, 608 insertions(+), 614 deletions(-)
diff --git a/tuna-cmd.py b/tuna-cmd.py index f49674787662..ebadbe1e240a 100755 --- a/tuna-cmd.py +++ b/tuna-cmd.py @@ -22,16 +22,16 @@ import locale from functools import reduce try: - import inet_diag - have_inet_diag = True + import inet_diag + have_inet_diag = True except: - have_inet_diag = False + have_inet_diag = False try: - set + set except NameError: - # In python < 2.4, "set" is not the first class citizen. - from sets import Set as set + # In python < 2.4, "set" is not the first class citizen. + from sets import Set as set # FIXME: ETOOMANYGLOBALS, we need a class! @@ -41,671 +41,665 @@ irqs = None version = "0.14.1" def usage(): - print(_('Usage: tuna [OPTIONS]')) - fmt = '\t%-40s %s' - print(fmt % ('-h, --help', _('Give this help list'))) - print(fmt % ('-a, --config_file_apply=profilename', _('Apply changes described in profile'))) - print(fmt % ('-l, --config_file_list', _('List preloaded profiles'))) - print(fmt % ('-g, --gui', _('Start the GUI'))) - print(fmt % ('-G, --cgroup', _('Display the processes with the type of cgroups they are in'))) - print(fmt % ('-c, --cpus=' + _('CPU-LIST'), _('%(cpulist)s affected by commands') % \ - {"cpulist": _('CPU-LIST')})) - print(fmt % ('-C, --affect_children', _('Operation will affect children threads'))) - print(fmt % ('-f, --filter', _('Display filter the selected entities'))) - print(fmt % ('-i, --isolate', _('Move all threads away from %(cpulist)s') % \ - {"cpulist": _('CPU-LIST')})) - print(fmt % ('-I, --include', _('Allow all threads to run on %(cpulist)s') % \ - {"cpulist": _('CPU-LIST')})) - print(fmt % ('-K, --no_kthreads', _('Operations will not affect kernel threads'))) - print(fmt % ('-m, --move', _('Move selected entities to %(cpulist)s') % \ - {"cpulist": _('CPU-LIST')})) - print(fmt % ('-N, --nohz_full', _('CPUs in nohz_full= kernel command line will be affected by operations'))) - if have_inet_diag: - print(fmt % ('-n, --show_sockets', _('Show network sockets in use by threads'))) - print(fmt % ('-p, --priority=[' + - _('POLICY') + ':]' + - _('RTPRIO'), _('Set thread scheduler tunables: %(policy)s and %(rtprio)s') % \ - {"policy": _('POLICY'), "rtprio": _('RTPRIO')})) - print(fmt % ('-P, --show_threads', _('Show thread list'))) - print(fmt % ('-Q, --show_irqs', _('Show IRQ list'))) - print(fmt % ('-q, --irqs=' + _('IRQ-LIST'), _('%(irqlist)s affected by commands') % - {"irqlist": _('IRQ-LIST')})) - print(fmt % ('-r, --run=' + _('COMMAND'), _('fork a new process and run the %(command)s') % \ - {"command": _('COMMAND')})) - print(fmt % ('-s, --save=' + _('FILENAME'), _('Save kthreads sched tunables to %(filename)s') % \ - {"filename": _('FILENAME')})) - print(fmt % ('-S, --sockets=' + - _('CPU-SOCKET-LIST'), _('%(cpusocketlist)s affected by commands') % \ - {"cpusocketlist": _('CPU-SOCKET-LIST')})) - print(fmt % ('-t, --threads=' + - _('THREAD-LIST'), _('%(threadlist)s affected by commands') % \ - {"threadlist": _('THREAD-LIST')})) - print(fmt % ('-U, --no_uthreads', _('Operations will not affect user threads'))) - print(fmt % ('-v, --version', _('Show version'))) - print(fmt % ('-W, --what_is', _('Provides help about selected entities'))) - print(fmt % ('-x, --spread', _('Spread selected entities over %(cpulist)s') % \ - {"cpulist": _('CPU-LIST')})) + print(_('Usage: tuna [OPTIONS]')) + fmt = '\t%-40s %s' + print(fmt % ('-h, --help', _('Give this help list'))) + print(fmt % ('-a, --config_file_apply=profilename', _('Apply changes described in profile'))) + print(fmt % ('-l, --config_file_list', _('List preloaded profiles'))) + print(fmt % ('-g, --gui', _('Start the GUI'))) + print(fmt % ('-G, --cgroup', _('Display the processes with the type of cgroups they are in'))) + print(fmt % ('-c, --cpus=' + _('CPU-LIST'), _('%(cpulist)s affected by commands') % \ + {"cpulist": _('CPU-LIST')})) + print(fmt % ('-C, --affect_children', _('Operation will affect children threads'))) + print(fmt % ('-f, --filter', _('Display filter the selected entities'))) + print(fmt % ('-i, --isolate', _('Move all threads away from %(cpulist)s') % \ + {"cpulist": _('CPU-LIST')})) + print(fmt % ('-I, --include', _('Allow all threads to run on %(cpulist)s') % \ + {"cpulist": _('CPU-LIST')})) + print(fmt % ('-K, --no_kthreads', _('Operations will not affect kernel threads'))) + print(fmt % ('-m, --move', _('Move selected entities to %(cpulist)s') % \ + {"cpulist": _('CPU-LIST')})) + print(fmt % ('-N, --nohz_full', _('CPUs in nohz_full= kernel command line will be affected by operations'))) + if have_inet_diag: + print(fmt % ('-n, --show_sockets', _('Show network sockets in use by threads'))) + print(fmt % ('-p, --priority=[' + + _('POLICY') + ':]' + + _('RTPRIO'), _('Set thread scheduler tunables: %(policy)s and %(rtprio)s') % \ + {"policy": _('POLICY'), "rtprio": _('RTPRIO')})) + print(fmt % ('-P, --show_threads', _('Show thread list'))) + print(fmt % ('-Q, --show_irqs', _('Show IRQ list'))) + print(fmt % ('-q, --irqs=' + _('IRQ-LIST'), _('%(irqlist)s affected by commands') % + {"irqlist": _('IRQ-LIST')})) + print(fmt % ('-r, --run=' + _('COMMAND'), _('fork a new process and run the %(command)s') % \ + {"command": _('COMMAND')})) + print(fmt % ('-s, --save=' + _('FILENAME'), _('Save kthreads sched tunables to %(filename)s') % \ + {"filename": _('FILENAME')})) + print(fmt % ('-S, --sockets=' + + _('CPU-SOCKET-LIST'), _('%(cpusocketlist)s affected by commands') % \ + {"cpusocketlist": _('CPU-SOCKET-LIST')})) + print(fmt % ('-t, --threads=' + + _('THREAD-LIST'), _('%(threadlist)s affected by commands') % \ + {"threadlist": _('THREAD-LIST')})) + print(fmt % ('-U, --no_uthreads', _('Operations will not affect user threads'))) + print(fmt % ('-v, --version', _('Show version'))) + print(fmt % ('-W, --what_is', _('Provides help about selected entities'))) + print(fmt % ('-x, --spread', _('Spread selected entities over %(cpulist)s') % \ + {"cpulist": _('CPU-LIST')})) def get_nr_cpus(): - global nr_cpus - if nr_cpus: - return nr_cpus - nr_cpus = procfs.cpuinfo().nr_cpus + global nr_cpus + if nr_cpus: return nr_cpus + nr_cpus = procfs.cpuinfo().nr_cpus + return nr_cpus nics = None def get_nics(): - global nics - if nics: - return nics - nics = ethtool.get_active_devices() + global nics + if nics: return nics + nics = ethtool.get_active_devices() + return nics def thread_help(tid): - global ps - if not ps: - ps = procfs.pidstats() + global ps + if not ps: + ps = procfs.pidstats() - if tid not in ps: - print("tuna: " + _("thread %d doesn't exists!") % tid) - return + if tid not in ps: + print("tuna: " + _("thread %d doesn't exists!") % tid) + return - pinfo = ps[tid] - cmdline = procfs.process_cmdline(pinfo) - help, title = tuna.kthread_help_plain_text(tid, cmdline) - print("%s\n\n%s" % (title, _(help))) + pinfo = ps[tid] + cmdline = procfs.process_cmdline(pinfo) + help, title = tuna.kthread_help_plain_text(tid, cmdline) + print("%s\n\n%s" % (title, _(help))) def save(cpu_list, thread_list, filename): - kthreads = tuna.get_kthread_sched_tunings() - for name in list(kthreads.keys()): - kt = kthreads[name] - if (cpu_list and not set(kt.affinity).intersection(set(cpu_list))) or \ - (thread_list and kt.pid not in thread_list) : - del kthreads[name] - tuna.generate_rtgroups(filename, kthreads, get_nr_cpus()) - -def ps_show_header(has_ctxt_switch_info,cgroups = False): - print("%7s %6s %5s %7s %s" % \ - (" ", " ", " ", _("thread"), - has_ctxt_switch_info and "ctxt_switches" or "")) - print("%7s %6s %5s %7s%s %15s" % \ - ("pid", "SCHED_", "rtpri", "affinity", - has_ctxt_switch_info and " %9s %12s" % ("voluntary", "nonvoluntary") or "", - "cmd"), end=' ') - if cgroups: - print(" %7s" % ("cgroup")) - else: - print("") + kthreads = tuna.get_kthread_sched_tunings() + for name in list(kthreads.keys()): + kt = kthreads[name] + if (cpu_list and not set(kt.affinity).intersection(set(cpu_list))) or \ + (thread_list and kt.pid not in thread_list): + del kthreads[name] + tuna.generate_rtgroups(filename, kthreads, get_nr_cpus()) + +def ps_show_header(has_ctxt_switch_info, cgroups=False): + print("%7s %6s %5s %7s %s" % \ + (" ", " ", " ", _("thread"), + has_ctxt_switch_info and "ctxt_switches" or "")) + print("%7s %6s %5s %7s%s %15s" % \ + ("pid", "SCHED_", "rtpri", "affinity", + has_ctxt_switch_info and " %9s %12s" % ("voluntary", "nonvoluntary") or "", + "cmd"), end=' ') + if cgroups: + print(" %7s" % ("cgroup")) + else: + print("") -def ps_show_sockets(pid, ps, inodes, inode_re, indent = 0): - header_printed = False - dirname = "/proc/%s/fd" % pid +def ps_show_sockets(pid, ps, inodes, inode_re, indent=0): + header_printed = False + dirname = "/proc/%s/fd" % pid + try: + filenames = os.listdir(dirname) + except: # Process died + return + sindent = " " * indent + for filename in filenames: + pathname = os.path.join(dirname, filename) try: - filenames = os.listdir(dirname) + linkto = os.readlink(pathname) except: # Process died - return - sindent = " " * indent - for filename in filenames: - pathname = os.path.join(dirname, filename) - try: - linkto = os.readlink(pathname) - except: # Process died - continue - inode_match = inode_re.match(linkto) - if not inode_match: - continue - inode = int(inode_match.group(1)) - if inode not in inodes: - continue - if not header_printed: - print("%s%-10s %-6s %-6s %15s:%-5s %15s:%-5s" % \ - (sindent, "State", "Recv-Q", "Send-Q", - "Local Address", "Port", - "Peer Address", "Port")) - header_printed = True - s = inodes[inode] - print("%s%-10s %-6d %-6d %15s:%-5d %15s:%-5d" % \ - (sindent, s.state(), - s.receive_queue(), s.write_queue(), - s.saddr(), s.sport(), s.daddr(), s.dport())) + continue + inode_match = inode_re.match(linkto) + if not inode_match: + continue + inode = int(inode_match.group(1)) + if inode not in inodes: + continue + if not header_printed: + print("%s%-10s %-6s %-6s %15s:%-5s %15s:%-5s" % \ + (sindent, "State", "Recv-Q", "Send-Q", + "Local Address", "Port", + "Peer Address", "Port")) + header_printed = True + s = inodes[inode] + print("%s%-10s %-6d %-6d %15s:%-5d %15s:%-5d" % \ + (sindent, s.state(), + s.receive_queue(), s.write_queue(), + s.saddr(), s.sport(), s.daddr(), s.dport())) 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 ps_show_thread(pid, affect_children, ps, - has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups): - global irqs + 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 ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes, + sock_inode_re, cgroups): + global irqs + try: + affinity = format_affinity(schedutils.get_affinity(pid)) + except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError + if e.args[0] == errno.ESRCH: + return + raise e + + sched = schedutils.schedstr(schedutils.get_scheduler(pid))[6:] + rtprio = int(ps[pid]["stat"]["rt_priority"]) + cgout = ps[pid]["cgroups"] + cmd = ps[pid]["stat"]["comm"] + users = "" + if tuna.is_irq_thread(cmd): try: - affinity = format_affinity(schedutils.get_affinity(pid)) - except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError - if e.args[0] == errno.ESRCH: - return - raise e - - sched = schedutils.schedstr(schedutils.get_scheduler(pid))[6:] - rtprio = int(ps[pid]["stat"]["rt_priority"]) - cgout = ps[pid]["cgroups"] - cmd = ps[pid]["stat"]["comm"] - users = "" - if tuna.is_irq_thread(cmd): + if not irqs: + irqs = procfs.interrupts() + if cmd[:4] == "IRQ-": + users = irqs[tuna.irq_thread_number(cmd)]["users"] + for u in users: + if u in get_nics(): + users[users.index(u)] = "%s(%s)" % (u, ethtool.get_module(u)) + users = ",".join(users) + else: + u = cmd[cmd.find('-') + 1:] + if u in get_nics(): + users = ethtool.get_module(u) + except: + users = "Not found in /proc/interrupts!" + + ctxt_switch_info = "" + if has_ctxt_switch_info: + voluntary_ctxt_switches = int(ps[pid]["status"]["voluntary_ctxt_switches"]) + nonvoluntary_ctxt_switches = int(ps[pid]["status"]["nonvoluntary_ctxt_switches"]) + ctxt_switch_info = " %9d %12s" % (voluntary_ctxt_switches, + nonvoluntary_ctxt_switches) + + if affect_children: + print(" %-5d " % pid, end=' ') + else: + print(" %-5d" % pid, end=' ') + print("%6s %5d %8s%s %15s %s" % (sched, rtprio, affinity, + ctxt_switch_info, cmd, users), end=' ') + if cgroups: + print(" %9s" % cgout, end=' ') + print("") + if sock_inodes: + ps_show_sockets(pid, ps, sock_inodes, sock_inode_re, + affect_children and 3 or 4) + if affect_children and "threads" in ps[pid]: + for tid in list(ps[pid]["threads"].keys()): + ps_show_thread(tid, False, ps[pid]["threads"], + has_ctxt_switch_info, + sock_inodes, sock_inode_re, cgroups) + + +def ps_show(ps, affect_children, thread_list, cpu_list, \ + irq_list_numbers, show_uthreads, show_kthreads, \ + has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups): + + ps_list = [] + for pid in list(ps.keys()): + iskth = tuna.iskthread(pid) + if not show_uthreads and not iskth: + continue + if not show_kthreads and iskth: + continue + in_irq_list = False + if irq_list_numbers: + if tuna.is_hardirq_handler(ps, pid): try: - if not irqs: - irqs = procfs.interrupts() - if cmd[:4] == "IRQ-": - users = irqs[tuna.irq_thread_number(cmd)]["users"] - for u in users: - if u in get_nics(): - users[users.index(u)] = "%s(%s)" % (u, ethtool.get_module(u)) - users = ",".join(users) - else: - u = cmd[cmd.find('-') + 1:] - if u in get_nics(): - users = ethtool.get_module(u) + irq = int(ps[pid]["stat"]["comm"][4:]) + if irq not in irq_list_numbers: + if not thread_list: + continue + else: + in_irq_list = True except: - users = "Not found in /proc/interrupts!" - - ctxt_switch_info = "" - if has_ctxt_switch_info: - voluntary_ctxt_switches = int(ps[pid]["status"]["voluntary_ctxt_switches"]) - nonvoluntary_ctxt_switches = int(ps[pid]["status"]["nonvoluntary_ctxt_switches"]) - ctxt_switch_info = " %9d %12s" % (voluntary_ctxt_switches, - nonvoluntary_ctxt_switches) - - if affect_children: - print(" %-5d " % pid, end=' ') - else: - print(" %-5d" % pid, end=' ') - print("%6s %5d %8s%s %15s %s" % (sched, rtprio, affinity, - ctxt_switch_info, cmd, users), end=' ') - if cgroups: - print(" %9s" % cgout, end=' ') - print("") - if sock_inodes: - ps_show_sockets(pid, ps, sock_inodes, sock_inode_re, - affect_children and 3 or 4) - if affect_children and "threads" in ps[pid]: - for tid in list(ps[pid]["threads"].keys()): - ps_show_thread(tid, False, ps[pid]["threads"], - has_ctxt_switch_info, - sock_inodes, sock_inode_re, cgroups) - - -def ps_show(ps, affect_children, thread_list, cpu_list, - irq_list_numbers, show_uthreads, show_kthreads, - has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups): - - ps_list = [] - for pid in list(ps.keys()): - iskth = tuna.iskthread(pid) - if not show_uthreads and not iskth: - continue - if not show_kthreads and iskth: - continue - in_irq_list = False - if irq_list_numbers: - if tuna.is_hardirq_handler(ps, pid): - try: - irq = int(ps[pid]["stat"]["comm"][4:]) - if irq not in irq_list_numbers: - if not thread_list: - continue - else: - in_irq_list = True - except: - pass - elif not thread_list: - continue - if not in_irq_list and thread_list and pid not in thread_list: - continue - try: - affinity = schedutils.get_affinity(pid) - except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError - if e.args[0] == errno.ESRCH: - continue - raise e - if cpu_list and not set(cpu_list).intersection(set(affinity)): - continue - ps_list.append(pid) - - ps_list.sort() - - for pid in ps_list: - ps_show_thread(pid, affect_children, ps, - has_ctxt_switch_info, sock_inodes, - sock_inode_re, cgroups) + pass + elif not thread_list: + continue + if not in_irq_list and thread_list and pid not in thread_list: + continue + try: + affinity = schedutils.get_affinity(pid) + except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError + if e.args[0] == errno.ESRCH: + continue + raise e + if cpu_list and not set(cpu_list).intersection(set(affinity)): + continue + ps_list.append(pid) + + ps_list.sort() + + for pid in ps_list: + ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, + sock_inodes, sock_inode_re, cgroups) def load_socktype(socktype, inodes): - idiag = inet_diag.create(socktype = socktype) - while True: - try: - s = idiag.get() - except: - break - inodes[s.inode()] = s + idiag = inet_diag.create(socktype=socktype) + while True: + try: + s = idiag.get() + except: + break + inodes[s.inode()] = s def load_sockets(): - inodes = {} - for socktype in (inet_diag.TCPDIAG_GETSOCK, - inet_diag.DCCPDIAG_GETSOCK): - load_socktype(socktype, inodes) - return inodes - -def do_ps(thread_list, cpu_list, irq_list, show_uthreads, - show_kthreads, affect_children, show_sockets, cgroups): - ps = procfs.pidstats() - if affect_children: - ps.reload_threads() - - sock_inodes = None - sock_inode_re = None - if show_sockets: - sock_inodes = load_sockets() - sock_inode_re = re.compile(r"socket:\[(\d+)\]") - - has_ctxt_switch_info = "voluntary_ctxt_switches" in ps[1]["status"] - try: - if sys.stdout.isatty(): - ps_show_header(has_ctxt_switch_info, cgroups) - ps_show(ps, affect_children, thread_list, - cpu_list, irq_list, show_uthreads, show_kthreads, - has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups) - except IOError: - # 'tuna -P | head' for instance - pass + inodes = {} + for socktype in (inet_diag.TCPDIAG_GETSOCK, inet_diag.DCCPDIAG_GETSOCK): + load_socktype(socktype, inodes) + return inodes + +def do_ps(thread_list, cpu_list, irq_list, show_uthreads, show_kthreads, + affect_children, show_sockets, cgroups): + ps = procfs.pidstats() + if affect_children: + ps.reload_threads() + + sock_inodes = None + sock_inode_re = None + if show_sockets: + sock_inodes = load_sockets() + sock_inode_re = re.compile(r"socket:\[(\d+)\]") + + has_ctxt_switch_info = "voluntary_ctxt_switches" in ps[1]["status"] + try: + if sys.stdout.isatty(): + ps_show_header(has_ctxt_switch_info, cgroups) + ps_show(ps, affect_children, thread_list, \ + cpu_list, irq_list, show_uthreads, show_kthreads, \ + has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups) + except IOError: + # 'tuna -P | head' for instance + pass def find_drivers_by_users(users): - nics = get_nics() - drivers = [] - for u in users: - try: - idx = u.index('-') - u = u[:idx] - except: - pass - if u in nics: - driver = ethtool.get_module(u) - if driver not in drivers: - drivers.append(driver) - - return drivers + nics = get_nics() + drivers = [] + for u in users: + try: + idx = u.index('-') + u = u[:idx] + except: + pass + if u in nics: + driver = ethtool.get_module(u) + if driver not in drivers: + drivers.append(driver) -def show_irqs(irq_list, cpu_list): - global irqs - if not irqs: - irqs = procfs.interrupts() + return drivers - if sys.stdout.isatty(): - print("%4s %-16s %8s" % ("#", _("users"), _("affinity"),)) - sorted_irqs = [] - for k in list(irqs.keys()): - try: - irqn = int(k) - affinity = irqs[irqn]["affinity"] - except: - continue - if irq_list and irqn not in irq_list: - continue - - if cpu_list and not set(cpu_list).intersection(set(affinity)): - continue - sorted_irqs.append(irqn) - - sorted_irqs.sort() - for irq in sorted_irqs: - affinity = format_affinity(irqs[irq]["affinity"]) - users = irqs[irq]["users"] - print("%4d %-16s %8s" % (irq, ",".join(users), affinity), end=' ') - drivers = find_drivers_by_users(users) - if drivers: - print(" %s" % ",".join(drivers)) - else: - print() +def show_irqs(irq_list, cpu_list): + global irqs + if not irqs: + irqs = procfs.interrupts() + + if sys.stdout.isatty(): + print("%4s %-16s %8s" % ("#", _("users"), _("affinity"),)) + sorted_irqs = [] + for k in list(irqs.keys()): + try: + irqn = int(k) + affinity = irqs[irqn]["affinity"] + except: + continue + if irq_list and irqn not in irq_list: + continue + + if cpu_list and not set(cpu_list).intersection(set(affinity)): + continue + sorted_irqs.append(irqn) + + sorted_irqs.sort() + for irq in sorted_irqs: + affinity = format_affinity(irqs[irq]["affinity"]) + users = irqs[irq]["users"] + print("%4d %-16s %8s" % (irq, ",".join(users), affinity), end=' ') + drivers = find_drivers_by_users(users) + if drivers: + print(" %s" % ",".join(drivers)) + else: + print() def do_list_op(op, current_list, op_list): - if not current_list: - current_list = [] - if op == '+': - return list(set(current_list + op_list)) - if op == '-': - return list(set(current_list) - set(op_list)) - return list(set(op_list)) + if not current_list: + current_list = [] + if op == '+': + return list(set(current_list + op_list)) + if op == '-': + return list(set(current_list) - set(op_list)) + return list(set(op_list)) def thread_mapper(s): - global ps - try: - return [ int(s), ] - except: - pass + global ps + try: + return [int(s),] + except: + pass - ps = procfs.pidstats() + ps = procfs.pidstats() - try: - return ps.find_by_regex(re.compile(fnmatch.translate(s))) - except: - return ps.find_by_name(s) + try: + return ps.find_by_regex(re.compile(fnmatch.translate(s))) + except: + return ps.find_by_name(s) def irq_mapper(s): - global irqs + global irqs + try: + return [int(s),] + except: + pass + if not irqs: + irqs = procfs.interrupts() + + irq_list_str = irqs.find_by_user_regex(re.compile(fnmatch.translate(s))) + irq_list = [] + for i in irq_list_str: try: - return [ int(s), ] + irq_list.append(int(i)) except: - pass - if not irqs: - irqs = procfs.interrupts() + pass - irq_list_str = irqs.find_by_user_regex(re.compile(fnmatch.translate(s))) - irq_list = [] - for i in irq_list_str: - try: - irq_list.append(int(i)) - except: - pass - - return irq_list + return irq_list def pick_op(argument): - if argument == "": - return (None, argument) - if argument[0] in ('+', '-'): - return (argument[0], argument[1:]) + if argument == "": return (None, argument) + if argument[0] in ('+', '-'): + return (argument[0], argument[1:]) + return (None, argument) def i18n_init(): - (app, localedir) = ('tuna', '/usr/share/locale') - locale.setlocale(locale.LC_ALL, '') - gettext.bindtextdomain(app, localedir) - gettext.textdomain(app) - gettext.install(app, localedir) + (app, localedir) = ('tuna', '/usr/share/locale') + locale.setlocale(locale.LC_ALL, '') + gettext.bindtextdomain(app, localedir) + gettext.textdomain(app) + gettext.install(app, localedir) def apply_config(filename): - from tuna.config import Config - config = Config() - if os.path.exists(filename): - config.config['root'] = os.getcwd() + "/" - filename = os.path.basename(filename) - else: - if not os.path.exists(config.config['root']+filename): - print(filename + _(" not found!")) - exit(-1) - if config.loadTuna(filename): - exit(1) - ctrl = 0 - values = {} - values['toapply'] = {} - for index in range(len(config.ctlParams)): - for opt in config.ctlParams[index]: - values['toapply'][ctrl] = {} - values['toapply'][ctrl]['label'] = opt - values['toapply'][ctrl]['value'] = config.ctlParams[index][opt] - ctrl = ctrl + 1 - config.applyChanges(values) + from tuna.config import Config + config = Config() + if os.path.exists(filename): + config.config['root'] = os.getcwd() + "/" + filename = os.path.basename(filename) + else: + if not os.path.exists(config.config['root']+filename): + print(filename + _(" not found!")) + exit(-1) + if config.loadTuna(filename): + exit(1) + ctrl = 0 + values = {} + values['toapply'] = {} + for index in range(len(config.ctlParams)): + for opt in config.ctlParams[index]: + values['toapply'][ctrl] = {} + values['toapply'][ctrl]['label'] = opt + values['toapply'][ctrl]['value'] = config.ctlParams[index][opt] + ctrl = ctrl + 1 + config.applyChanges(values) def list_config(): - from tuna.config import Config - config = Config() - print(_("Preloaded config files:")) - for value in config.populate(): - print(value) - exit(1) + from tuna.config import Config + config = Config() + print(_("Preloaded config files:")) + for value in config.populate(): + print(value) + exit(1) def main(): - global ps - - i18n_init() - try: - short = "a:c:CfgGhiIKlmNp:PQq:r:s:S:t:UvWx" - long = ["cpus=", "affect_children", "filter", "gui", "help", - "isolate", "include", "no_kthreads", "move", "nohz_full", - "show_sockets", "priority=", "show_threads", - "show_irqs", "irqs=", - "save=", "sockets=", "threads=", "no_uthreads", - "version", "what_is", "spread","cgroup","config_file_apply=","config_file_list=", - "run=" ] - if have_inet_diag: - short += "n" - int.append("show_sockets") - opts, args = getopt.getopt(sys.argv[1:], short, long) - except getopt.GetoptError as err: + global ps + + i18n_init() + try: + short = "a:c:CfgGhiIKlmNp:PQq:r:s:S:t:UvWx" + long = ["cpus=", "affect_children", "filter", "gui", "help", \ + "isolate", "include", "no_kthreads", "move", "nohz_full", \ + "show_sockets", "priority=", "show_threads", \ + "show_irqs", "irqs=", \ + "save=", "sockets=", "threads=", "no_uthreads", \ + "version", "what_is", "spread", "cgroup", "config_file_apply=", \ + "config_file_list=", "run="] + if have_inet_diag: + short += "n" + int.append("show_sockets") + opts, args = getopt.getopt(sys.argv[1:], short, long) + except getopt.GetoptError as err: + usage() + print(str(err)) + sys.exit(2) + + run_gui = not opts + kthreads = True + uthreads = True + cgroups = False + cpu_list = None + irq_list = None + irq_list_str = None + rtprio = None + policy = None + thread_list = [] + thread_list_str = None + filter = False + affect_children = False + show_sockets = False + p_waiting_action = False + + for o, a in opts: + if o in ("-h", "--help"): + usage() + return + elif o in ("-a", "--config_file_apply"): + apply_config(a) + elif o in ("-l", "--config_file_list"): + list_config() + elif o in ("-c", "--cpus"): + (op, a) = pick_op(a) + try: + op_list = tuna.cpustring_to_list(a) + except ValueError: usage() - print(str(err)) + return + cpu_list = do_list_op(op, cpu_list, op_list) + elif o in ("-N", "--nohz_full"): + try: + cpu_list = tuna.nohz_full_list() + except: + print("tuna: --nohz_full " + _(" needs nohz_full=cpulist on the kernel command line")) sys.exit(2) - - run_gui = not opts - kthreads = True - uthreads = True - cgroups = False - cpu_list = None - irq_list = None - irq_list_str = None - rtprio = None - policy = None - thread_list = [] - thread_list_str = None - filter = False - affect_children = False - show_sockets = False - p_waiting_action = False - - for o, a in opts: - if o in ("-h", "--help"): - usage() - return - elif o in ("-a", "--config_file_apply"): - apply_config(a) - elif o in ("-l", "--config_file_list"): - list_config() - elif o in ("-c", "--cpus"): - (op, a) = pick_op(a) - try: - op_list = tuna.cpustring_to_list(a) - except ValueError: - usage() - return - cpu_list = do_list_op(op, cpu_list, op_list) - elif o in ("-N", "--nohz_full"): - try: - cpu_list = tuna.nohz_full_list() - except: - print("tuna: --nohz_full " + _(" needs nohz_full=cpulist on the kernel command line")) - sys.exit(2) - elif o in ("-C", "--affect_children"): - affect_children = True - elif o in ("-G", "--cgroup"): - cgroups = True - elif o in ("-t", "--threads"): - # The -t - will reset thread list - if a == '-': - thread_list = [] - thread_list_str = '' - else: - (op, a) = pick_op(a) - op_list = reduce(lambda i, j: i + j, - list(map(thread_mapper, a.split(",")))) - op_list = list(set(op_list)) - thread_list = do_list_op(op, thread_list, op_list) - # Check if a process name was especified and no - # threads was found, which would result in an empty - # thread list, i.e. we would print all the threads - # in the system when we should print nothing. - if not op_list and type(a) == type(''): - thread_list_str = do_list_op(op, thread_list_str, - a.split(",")) - if not op: - irq_list = None - elif o in ("-f", "--filter"): - filter = True - elif o in ("-g", "--gui"): - run_gui = True - elif o in ("-i", "--isolate"): - if not cpu_list: - print("tuna: --isolate " + _("requires a cpu list!")) - sys.exit(2) - tuna.isolate_cpus(cpu_list, get_nr_cpus()) - elif o in ("-I", "--include"): - if not cpu_list: - print("tuna: --include " + _("requires a cpu list!")) - sys.exit(2) - tuna.include_cpus(cpu_list, get_nr_cpus()) - elif o in ("-p", "--priority"): - # Save policy and rtprio for future Actions (e.g. --run). - (policy, rtprio) = tuna.get_policy_and_rtprio(a) - if not thread_list: - # For backward compatibility - p_waiting_action = True - else: - try: - tuna.threads_set_priority(thread_list, a, affect_children) - except (SystemError, OSError) as err: # old python-schedutils incorrectly raised SystemError - print("tuna: %s" % err) - sys.exit(2) - elif o in ("-P", "--show_threads"): - # If the user specified process names that weren't - # resolved to pids, don't show all threads. - if not thread_list and not irq_list: - if thread_list_str or irq_list_str: - continue - do_ps(thread_list, cpu_list, irq_list, uthreads, - kthreads, affect_children, show_sockets, cgroups) - elif o in ("-Q", "--show_irqs"): - # If the user specified IRQ names that weren't - # resolved to IRQs, don't show all IRQs. - if not irq_list and irq_list_str: - continue - show_irqs(irq_list, cpu_list) - elif o in ("-n", "--show_sockets"): - show_sockets = True - elif o in ("-m", "--move", "-x", "--spread"): - if not cpu_list: - print("tuna: --move " + _("requires a cpu list!")) - sys.exit(2) - if not (thread_list or irq_list): - print("tuna: --move " + _("requires a list of threads/irqs!")) - sys.exit(2) - - spread = o in ("-x", "--spread") - - if thread_list: - tuna.move_threads_to_cpu(cpu_list, thread_list, - spread = spread) - - if irq_list: - tuna.move_irqs_to_cpu(cpu_list, irq_list, - spread = spread) - elif o in ("-s", "--save"): - save(cpu_list, thread_list, a) - elif o in ("-S", "--sockets"): - (op, a) = pick_op(a) - sockets = [socket for socket in a.split(",")] - - if not cpu_list: - cpu_list = [] - - cpu_info = sysfs.cpus() - op_list = [] - for socket in sockets: - if socket not in cpu_info.sockets: - print("tuna: %s" % \ - (_("invalid socket %(socket)s sockets available: %(available)s") % \ - {"socket": socket, - "available": ",".join(list(cpu_info.sockets.keys()))})) - sys.exit(2) - op_list += [ int(cpu.name[3:]) for cpu in cpu_info.sockets[socket] ] - cpu_list = do_list_op(op, cpu_list, op_list) - elif o in ("-K", "--no_kthreads"): - kthreads = False - elif o in ("-q", "--irqs"): - (op, a) = pick_op(a) - op_list = reduce(lambda i, j: i + j, - list(map(irq_mapper, list(set(a.split(",")))))) - irq_list = do_list_op(op, irq_list, op_list) - # See comment above about thread_list_str - if not op_list and type(a) == type(''): - irq_list_str = do_list_op(op, irq_list_str, - a.split(",")) - if not op: - thread_list = [] - if not ps: - ps = procfs.pidstats() - if tuna.has_threaded_irqs(ps): - for irq in irq_list: - irq_re = tuna.threaded_irq_re(irq) - irq_threads = ps.find_by_regex(irq_re) - if irq_threads: - # Change the affinity of the thread too - # as we can't rely on changing the irq - # affinity changing the affinity of the - # thread or vice versa. We need to change - # both. - thread_list += irq_threads - - elif o in ("-U", "--no_uthreads"): - uthreads = False - elif o in ("-v", "--version"): - print(version) - elif o in ("-W", "--what_is"): - if not thread_list: - print("tuna: --what_is " + _("requires a thread list!")) - sys.exit(2) - for tid in thread_list: - thread_help(tid) - elif o in ("-r", "--run"): - # If -p is set, it will be consumed. So, no backward compatible - # error handling action must be taken. - p_waiting_action = False - - # pick_op() before run the command: to remove the prefix - # + or - from command line. - (op, a) = pick_op(a) - - # In order to include the new process, it must run - # the command first, and then get the list of pids, - tuna.run_command(a, policy, rtprio, cpu_list) - - op_list = reduce(lambda i, j: i + j, - list(map(thread_mapper, a.split(",")))) - op_list = list(set(op_list)) - thread_list = do_list_op(op, thread_list, op_list) - - # Check if a process name was especified and no - # threads was found, which would result in an empty - # thread list, i.e. we would print all the threads - # in the system when we should print nothing. - if not op_list and type(a) == type(''): - thread_list_str = do_list_op(op, thread_list_str, - a.split(",")) - if not op: - irq_list = None - - # For backward compatibility: when -p used to be only an Action, it - # used to exit(2) if no action was taken (i.e. if no threads_list - # was set). - if p_waiting_action: - print(("tuna: -p ") + _("requires a thread list!")) + elif o in ("-C", "--affect_children"): + affect_children = True + elif o in ("-G", "--cgroup"): + cgroups = True + elif o in ("-t", "--threads"): + # The -t - will reset thread list + if a == '-': + thread_list = [] + thread_list_str = '' + else: + (op, a) = pick_op(a) + op_list = reduce(lambda i, j: i + j, \ + list(map(thread_mapper, a.split(",")))) + op_list = list(set(op_list)) + thread_list = do_list_op(op, thread_list, op_list) + # Check if a process name was especified and no + # threads was found, which would result in an empty + # thread list, i.e. we would print all the threads + # in the system when we should print nothing. + if not op_list and type(a) == type(''): + thread_list_str = do_list_op(op, thread_list_str, + a.split(",")) + if not op: + irq_list = None + elif o in ("-f", "--filter"): + filter = True + elif o in ("-g", "--gui"): + run_gui = True + elif o in ("-i", "--isolate"): + if not cpu_list: + print("tuna: --isolate " + _("requires a cpu list!")) sys.exit(2) - - if run_gui: + tuna.isolate_cpus(cpu_list, get_nr_cpus()) + elif o in ("-I", "--include"): + if not cpu_list: + print("tuna: --include " + _("requires a cpu list!")) + sys.exit(2) + tuna.include_cpus(cpu_list, get_nr_cpus()) + elif o in ("-p", "--priority"): + # Save policy and rtprio for future Actions (e.g. --run). + (policy, rtprio) = tuna.get_policy_and_rtprio(a) + if not thread_list: + # For backward compatibility + p_waiting_action = True + else: try: - from tuna import tuna_gui - except ImportError: - # gui packages not installed - print(_('tuna: packages needed for the GUI missing.')) - print(_(' Make sure xauth, pygtk2-libglade are installed.')) - usage() - return - except RuntimeError: - print("tuna: machine needs to be authorized via xhost or ssh -X?") - return + tuna.threads_set_priority(thread_list, a, affect_children) + except (SystemError, OSError) as err: # old python-schedutils incorrectly raised SystemError + print("tuna: %s" % err) + sys.exit(2) + elif o in ("-P", "--show_threads"): + # If the user specified process names that weren't + # resolved to pids, don't show all threads. + if not thread_list and not irq_list: + if thread_list_str or irq_list_str: + continue + do_ps(thread_list, cpu_list, irq_list, uthreads, \ + kthreads, affect_children, show_sockets, cgroups) + elif o in ("-Q", "--show_irqs"): + # If the user specified IRQ names that weren't + # resolved to IRQs, don't show all IRQs. + if not irq_list and irq_list_str: + continue + show_irqs(irq_list, cpu_list) + elif o in ("-n", "--show_sockets"): + show_sockets = True + elif o in ("-m", "--move", "-x", "--spread"): + if not cpu_list: + print("tuna: --move " + _("requires a cpu list!")) + sys.exit(2) + if not (thread_list or irq_list): + print("tuna: --move " + _("requires a list of threads/irqs!")) + sys.exit(2) - try: - cpus_filtered = filter and cpu_list or [] - app = tuna_gui.main_gui(kthreads, uthreads, cpus_filtered) - app.run() - except KeyboardInterrupt: - pass + spread = o in ("-x", "--spread") + + if thread_list: + tuna.move_threads_to_cpu(cpu_list, thread_list, spread=spread) + + if irq_list: + tuna.move_irqs_to_cpu(cpu_list, irq_list, spread=spread) + elif o in ("-s", "--save"): + save(cpu_list, thread_list, a) + elif o in ("-S", "--sockets"): + (op, a) = pick_op(a) + sockets = [socket for socket in a.split(",")] + + if not cpu_list: + cpu_list = [] + + cpu_info = sysfs.cpus() + op_list = [] + for socket in sockets: + if socket not in cpu_info.sockets: + print("tuna: %s" % \ + (_("invalid socket %(socket)s sockets available: %(available)s") % \ + {"socket": socket, + "available": ",".join(list(cpu_info.sockets.keys()))})) + sys.exit(2) + op_list += [int(cpu.name[3:]) for cpu in cpu_info.sockets[socket]] + cpu_list = do_list_op(op, cpu_list, op_list) + elif o in ("-K", "--no_kthreads"): + kthreads = False + elif o in ("-q", "--irqs"): + (op, a) = pick_op(a) + op_list = reduce(lambda i, j: i + j, \ + list(map(irq_mapper, list(set(a.split(",")))))) + irq_list = do_list_op(op, irq_list, op_list) + # See comment above about thread_list_str + if not op_list and type(a) == type(''): + irq_list_str = do_list_op(op, irq_list_str, a.split(",")) + if not op: + thread_list = [] + if not ps: + ps = procfs.pidstats() + if tuna.has_threaded_irqs(ps): + for irq in irq_list: + irq_re = tuna.threaded_irq_re(irq) + irq_threads = ps.find_by_regex(irq_re) + if irq_threads: + # Change the affinity of the thread too + # as we can't rely on changing the irq + # affinity changing the affinity of the + # thread or vice versa. We need to change + # both. + thread_list += irq_threads + + elif o in ("-U", "--no_uthreads"): + uthreads = False + elif o in ("-v", "--version"): + print(version) + elif o in ("-W", "--what_is"): + if not thread_list: + print("tuna: --what_is " + _("requires a thread list!")) + sys.exit(2) + for tid in thread_list: + thread_help(tid) + elif o in ("-r", "--run"): + # If -p is set, it will be consumed. So, no backward compatible + # error handling action must be taken. + p_waiting_action = False + + # pick_op() before run the command: to remove the prefix + # + or - from command line. + (op, a) = pick_op(a) + + # In order to include the new process, it must run + # the command first, and then get the list of pids, + tuna.run_command(a, policy, rtprio, cpu_list) + + op_list = reduce(lambda i, j: i + j, \ + list(map(thread_mapper, a.split(",")))) + op_list = list(set(op_list)) + thread_list = do_list_op(op, thread_list, op_list) + + # Check if a process name was especified and no + # threads was found, which would result in an empty + # thread list, i.e. we would print all the threads + # in the system when we should print nothing. + if not op_list and type(a) == type(''): + thread_list_str = do_list_op(op, thread_list_str, a.split(",")) + if not op: + irq_list = None + + # For backward compatibility: when -p used to be only an Action, it + # used to exit(2) if no action was taken (i.e. if no threads_list + # was set). + if p_waiting_action: + print(("tuna: -p ") + _("requires a thread list!")) + sys.exit(2) + + if run_gui: + try: + from tuna import tuna_gui + except ImportError: + # gui packages not installed + print(_('tuna: packages needed for the GUI missing.')) + print(_(' Make sure xauth, pygtk2-libglade are installed.')) + usage() + return + except RuntimeError: + print("tuna: machine needs to be authorized via xhost or ssh -X?") + return + + try: + cpus_filtered = filter and cpu_list or [] + app = tuna_gui.main_gui(kthreads, uthreads, cpus_filtered) + app.run() + except KeyboardInterrupt: + pass if __name__ == '__main__': main() -- 2.26.2 _______________________________________________ tuna-devel mailing list -- tuna-devel@lists.fedorahosted.org To unsubscribe send an email to tuna-devel-le...@lists.fedorahosted.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedorahosted.org/archives/list/tuna-devel@lists.fedorahosted.org