1877108e4SArnaldo Carvalho de Melo#! /usr/bin/python 2877108e4SArnaldo Carvalho de Melo# -*- python -*- 3877108e4SArnaldo Carvalho de Melo# -*- coding: utf-8 -*- 4877108e4SArnaldo Carvalho de Melo# twatch - Experimental use of the perf python interface 5877108e4SArnaldo Carvalho de Melo# Copyright (C) 2011 Arnaldo Carvalho de Melo <[email protected]> 6877108e4SArnaldo Carvalho de Melo# 7877108e4SArnaldo Carvalho de Melo# This application is free software; you can redistribute it and/or 8877108e4SArnaldo Carvalho de Melo# modify it under the terms of the GNU General Public License 9877108e4SArnaldo Carvalho de Melo# as published by the Free Software Foundation; version 2. 10877108e4SArnaldo Carvalho de Melo# 11877108e4SArnaldo Carvalho de Melo# This application is distributed in the hope that it will be useful, 12877108e4SArnaldo Carvalho de Melo# but WITHOUT ANY WARRANTY; without even the implied warranty of 13877108e4SArnaldo Carvalho de Melo# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14877108e4SArnaldo Carvalho de Melo# General Public License for more details. 15877108e4SArnaldo Carvalho de Melo 16877108e4SArnaldo Carvalho de Meloimport perf 17877108e4SArnaldo Carvalho de Melo 18ae938802SArnaldo Carvalho de Melodef main(context_switch = 0, thread = -1): 19877108e4SArnaldo Carvalho de Melo cpus = perf.cpu_map() 20ae938802SArnaldo Carvalho de Melo threads = perf.thread_map(thread) 2158b32c1bSArnaldo Carvalho de Melo evsel = perf.evsel(type = perf.TYPE_SOFTWARE, 2258b32c1bSArnaldo Carvalho de Melo config = perf.COUNT_SW_DUMMY, 2358b32c1bSArnaldo Carvalho de Melo task = 1, comm = 1, mmap = 0, freq = 0, 24cfeb1d90SArnaldo Carvalho de Melo wakeup_events = 1, watermark = 1, 25ae938802SArnaldo Carvalho de Melo sample_id_all = 1, context_switch = context_switch, 263223565cSArnaldo Carvalho de Melo sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU) 2758b32c1bSArnaldo Carvalho de Melo 2858b32c1bSArnaldo Carvalho de Melo """What we want are just the PERF_RECORD_ lifetime events for threads, 2958b32c1bSArnaldo Carvalho de Melo using the default, PERF_TYPE_HARDWARE + PERF_COUNT_HW_CYCLES & freq=1 3058b32c1bSArnaldo Carvalho de Melo (the default), makes perf reenable irq_vectors:local_timer_entry, when 3158b32c1bSArnaldo Carvalho de Melo disabling nohz, not good for some use cases where all we want is to get 3258b32c1bSArnaldo Carvalho de Melo threads comes and goes... So use (perf.TYPE_SOFTWARE, perf_COUNT_SW_DUMMY, 3358b32c1bSArnaldo Carvalho de Melo freq=0) instead.""" 3458b32c1bSArnaldo Carvalho de Melo 35877108e4SArnaldo Carvalho de Melo evsel.open(cpus = cpus, threads = threads); 367e2ed097SArnaldo Carvalho de Melo evlist = perf.evlist(cpus, threads) 37877108e4SArnaldo Carvalho de Melo evlist.add(evsel) 387e2ed097SArnaldo Carvalho de Melo evlist.mmap() 39877108e4SArnaldo Carvalho de Melo while True: 40877108e4SArnaldo Carvalho de Melo evlist.poll(timeout = -1) 41877108e4SArnaldo Carvalho de Melo for cpu in cpus: 42877108e4SArnaldo Carvalho de Melo event = evlist.read_on_cpu(cpu) 43877108e4SArnaldo Carvalho de Melo if not event: 44877108e4SArnaldo Carvalho de Melo continue 45*d2ed5d2bSArnaldo Carvalho de Melo print("cpu: {0}, pid: {1}, tid: {2} {3}".format(event.sample_cpu, 46877108e4SArnaldo Carvalho de Melo event.sample_pid, 47*d2ed5d2bSArnaldo Carvalho de Melo event.sample_tid, 48*d2ed5d2bSArnaldo Carvalho de Melo event)) 49877108e4SArnaldo Carvalho de Melo 50877108e4SArnaldo Carvalho de Meloif __name__ == '__main__': 51ae938802SArnaldo Carvalho de Melo """ 52ae938802SArnaldo Carvalho de Melo To test the PERF_RECORD_SWITCH record, pick a pid and replace 53ae938802SArnaldo Carvalho de Melo in the following line. 54ae938802SArnaldo Carvalho de Melo 55ae938802SArnaldo Carvalho de Melo Example output: 56ae938802SArnaldo Carvalho de Melo 57ae938802SArnaldo Carvalho de Melocpu: 3, pid: 31463, tid: 31593 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31593, switch_out: 1 } 58ae938802SArnaldo Carvalho de Melocpu: 1, pid: 31463, tid: 31489 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31489, switch_out: 1 } 59ae938802SArnaldo Carvalho de Melocpu: 2, pid: 31463, tid: 31496 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31496, switch_out: 1 } 60ae938802SArnaldo Carvalho de Melocpu: 3, pid: 31463, tid: 31491 { type: context_switch, next_prev_pid: 31463, next_prev_tid: 31491, switch_out: 0 } 61ae938802SArnaldo Carvalho de Melo 62ae938802SArnaldo Carvalho de Melo It is possible as well to use event.misc & perf.PERF_RECORD_MISC_SWITCH_OUT 63ae938802SArnaldo Carvalho de Melo to figure out if this is a context switch in or out of the monitored threads. 64ae938802SArnaldo Carvalho de Melo 65ae938802SArnaldo Carvalho de Melo If bored, please add command line option parsing support for these options :-) 66ae938802SArnaldo Carvalho de Melo """ 67ae938802SArnaldo Carvalho de Melo # main(context_switch = 1, thread = 31463) 68877108e4SArnaldo Carvalho de Melo main() 69