1 #! /usr/bin/env python 1 #! /usr/bin/env python 2 # SPDX-License-Identifier: GPL-2.0-only 2 # SPDX-License-Identifier: GPL-2.0-only 3 # -*- python -*- 3 # -*- python -*- 4 # -*- coding: utf-8 -*- 4 # -*- coding: utf-8 -*- 5 # twatch - Experimental use of the perf pyth 5 # twatch - Experimental use of the perf python interface 6 # Copyright (C) 2011 Arnaldo Carvalho de Mel< 6 # Copyright (C) 2011 Arnaldo Carvalho de Melo <acme@redhat.com> 7 # 7 # 8 8 9 import perf 9 import perf 10 10 11 def main(context_switch = 0, thread = -1): 11 def main(context_switch = 0, thread = -1): 12 cpus = perf.cpu_map() 12 cpus = perf.cpu_map() 13 threads = perf.thread_map(thread) 13 threads = perf.thread_map(thread) 14 evsel = perf.evsel(type = perf.TYPE_ 14 evsel = perf.evsel(type = perf.TYPE_SOFTWARE, 15 config = perf.COUNT 15 config = perf.COUNT_SW_DUMMY, 16 task = 1, comm = 1, 16 task = 1, comm = 1, mmap = 0, freq = 0, 17 wakeup_events = 1, 17 wakeup_events = 1, watermark = 1, 18 sample_id_all = 1, 18 sample_id_all = 1, context_switch = context_switch, 19 sample_type = perf. 19 sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU) 20 20 21 """What we want are just the PERF_RECO 21 """What we want are just the PERF_RECORD_ lifetime events for threads, 22 using the default, PERF_TYPE_HARDWARE 22 using the default, PERF_TYPE_HARDWARE + PERF_COUNT_HW_CYCLES & freq=1 23 (the default), makes perf reenable ir 23 (the default), makes perf reenable irq_vectors:local_timer_entry, when 24 disabling nohz, not good for some use 24 disabling nohz, not good for some use cases where all we want is to get 25 threads comes and goes... So use (per 25 threads comes and goes... So use (perf.TYPE_SOFTWARE, perf_COUNT_SW_DUMMY, 26 freq=0) instead.""" 26 freq=0) instead.""" 27 27 28 evsel.open(cpus = cpus, threads = thre 28 evsel.open(cpus = cpus, threads = threads); 29 evlist = perf.evlist(cpus, threads) 29 evlist = perf.evlist(cpus, threads) 30 evlist.add(evsel) 30 evlist.add(evsel) 31 evlist.mmap() 31 evlist.mmap() 32 while True: 32 while True: 33 evlist.poll(timeout = -1) 33 evlist.poll(timeout = -1) 34 for cpu in cpus: 34 for cpu in cpus: 35 event = evlist.read_on 35 event = evlist.read_on_cpu(cpu) 36 if not event: 36 if not event: 37 continue 37 continue 38 print("cpu: {0}, pid: 38 print("cpu: {0}, pid: {1}, tid: {2} {3}".format(event.sample_cpu, 39 39 event.sample_pid, 40 40 event.sample_tid, 41 41 event)) 42 42 43 if __name__ == '__main__': 43 if __name__ == '__main__': 44 """ 44 """ 45 To test the PERF_RECORD_SWITCH record, 45 To test the PERF_RECORD_SWITCH record, pick a pid and replace 46 in the following line. 46 in the following line. 47 47 48 Example output: 48 Example output: 49 49 50 cpu: 3, pid: 31463, tid: 31593 { type: context 50 cpu: 3, pid: 31463, tid: 31593 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31593, switch_out: 1 } 51 cpu: 1, pid: 31463, tid: 31489 { type: context 51 cpu: 1, pid: 31463, tid: 31489 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31489, switch_out: 1 } 52 cpu: 2, pid: 31463, tid: 31496 { type: context 52 cpu: 2, pid: 31463, tid: 31496 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31496, switch_out: 1 } 53 cpu: 3, pid: 31463, tid: 31491 { type: context 53 cpu: 3, pid: 31463, tid: 31491 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31491, switch_out: 0 } 54 54 55 It is possible as well to use event.mi 55 It is possible as well to use event.misc & perf.PERF_RECORD_MISC_SWITCH_OUT 56 to figure out if this is a context swi 56 to figure out if this is a context switch in or out of the monitored threads. 57 57 58 If bored, please add command line opti 58 If bored, please add command line option parsing support for these options :-) 59 """ 59 """ 60 # main(context_switch = 1, thread = 31463) 60 # main(context_switch = 1, thread = 31463) 61 main() 61 main()
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.