1 #! /usr/bin/env python !! 1 #! /usr/bin/python 2 # SPDX-License-Identifier: GPL-2.0-only << 3 # -*- python -*- 2 # -*- python -*- 4 # -*- coding: utf-8 -*- 3 # -*- coding: utf-8 -*- 5 # twatch - Experimental use of the perf pyth 4 # twatch - Experimental use of the perf python interface 6 # Copyright (C) 2011 Arnaldo Carvalho de Mel< 5 # Copyright (C) 2011 Arnaldo Carvalho de Melo <acme@redhat.com> 7 # 6 # >> 7 # This application is free software; you can redistribute it and/or >> 8 # modify it under the terms of the GNU General Public License >> 9 # as published by the Free Software Foundation; version 2. >> 10 # >> 11 # This application is distributed in the hope that it will be useful, >> 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of >> 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> 14 # General Public License for more details. 8 15 9 import perf 16 import perf 10 17 11 def main(context_switch = 0, thread = -1): 18 def main(context_switch = 0, thread = -1): 12 cpus = perf.cpu_map() 19 cpus = perf.cpu_map() 13 threads = perf.thread_map(thread) 20 threads = perf.thread_map(thread) 14 evsel = perf.evsel(type = perf.TYPE_ 21 evsel = perf.evsel(type = perf.TYPE_SOFTWARE, 15 config = perf.COUNT 22 config = perf.COUNT_SW_DUMMY, 16 task = 1, comm = 1, 23 task = 1, comm = 1, mmap = 0, freq = 0, 17 wakeup_events = 1, 24 wakeup_events = 1, watermark = 1, 18 sample_id_all = 1, 25 sample_id_all = 1, context_switch = context_switch, 19 sample_type = perf. 26 sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU) 20 27 21 """What we want are just the PERF_RECO 28 """What we want are just the PERF_RECORD_ lifetime events for threads, 22 using the default, PERF_TYPE_HARDWARE 29 using the default, PERF_TYPE_HARDWARE + PERF_COUNT_HW_CYCLES & freq=1 23 (the default), makes perf reenable ir 30 (the default), makes perf reenable irq_vectors:local_timer_entry, when 24 disabling nohz, not good for some use 31 disabling nohz, not good for some use cases where all we want is to get 25 threads comes and goes... So use (per 32 threads comes and goes... So use (perf.TYPE_SOFTWARE, perf_COUNT_SW_DUMMY, 26 freq=0) instead.""" 33 freq=0) instead.""" 27 34 28 evsel.open(cpus = cpus, threads = thre 35 evsel.open(cpus = cpus, threads = threads); 29 evlist = perf.evlist(cpus, threads) 36 evlist = perf.evlist(cpus, threads) 30 evlist.add(evsel) 37 evlist.add(evsel) 31 evlist.mmap() 38 evlist.mmap() 32 while True: 39 while True: 33 evlist.poll(timeout = -1) 40 evlist.poll(timeout = -1) 34 for cpu in cpus: 41 for cpu in cpus: 35 event = evlist.read_on 42 event = evlist.read_on_cpu(cpu) 36 if not event: 43 if not event: 37 continue 44 continue 38 print("cpu: {0}, pid: 45 print("cpu: {0}, pid: {1}, tid: {2} {3}".format(event.sample_cpu, 39 46 event.sample_pid, 40 47 event.sample_tid, 41 48 event)) 42 49 43 if __name__ == '__main__': 50 if __name__ == '__main__': 44 """ 51 """ 45 To test the PERF_RECORD_SWITCH record, 52 To test the PERF_RECORD_SWITCH record, pick a pid and replace 46 in the following line. 53 in the following line. 47 54 48 Example output: 55 Example output: 49 56 50 cpu: 3, pid: 31463, tid: 31593 { type: context 57 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 58 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 59 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 60 cpu: 3, pid: 31463, tid: 31491 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31491, switch_out: 0 } 54 61 55 It is possible as well to use event.mi 62 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 63 to figure out if this is a context switch in or out of the monitored threads. 57 64 58 If bored, please add command line opti 65 If bored, please add command line option parsing support for these options :-) 59 """ 66 """ 60 # main(context_switch = 1, thread = 31463) 67 # main(context_switch = 1, thread = 31463) 61 main() 68 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.