3 # KVM Flight Recorder - ring buffer tracing script
5 # Copyright (C) 2012 IBM Corp
7 # Author: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
9 # This script provides a command-line interface to kvm ftrace and is designed
10 # to be used as a flight recorder that is always running. To start in-memory
13 # sudo kvm_flightrecorder start 8192 # 8 MB per-cpu ring buffers
15 # The per-cpu ring buffer size can be given in KB as an optional argument to
16 # the 'start' subcommand.
18 # To stop the flight recorder:
20 # sudo kvm_flightrecorder stop
22 # To dump the contents of the flight recorder (this can be done when the
23 # recorder is stopped or while it is running):
25 # sudo kvm_flightrecorder dump >/path/to/dump.txt
27 # To observe the trace while it is running, use the 'tail' subcommand:
29 # sudo kvm_flightrecorder tail
31 # Note that the flight recorder may impact overall system performance by
32 # consuming CPU cycles. No disk I/O is performed since the ring buffer holds a
33 # fixed-size in-memory trace.
38 tracing_dir
= '/sys/kernel/debug/tracing'
40 def trace_path(*args
):
41 return os
.path
.join(tracing_dir
, *args
)
43 def write_file(path
, data
):
44 open(path
, 'wb').write(data
)
46 def enable_event(subsystem
, event
, enable
):
47 write_file(trace_path('events', subsystem
, event
, 'enable'), '1' if enable
else '0')
49 def enable_subsystem(subsystem
, enable
):
50 write_file(trace_path('events', subsystem
, 'enable'), '1' if enable
else '0')
53 enable_subsystem('kvm', True)
54 write_file(trace_path('tracing_on'), '1')
57 write_file(trace_path('tracing_on'), '0')
58 enable_subsystem('kvm', False)
59 write_file(trace_path('events', 'enable'), '0')
60 write_file(trace_path('current_tracer'), 'nop')
63 tracefile
= open(trace_path('trace'), 'r')
67 lines
= tracefile
.readlines(64 * 1024)
68 sys
.stdout
.writelines(lines
)
69 except KeyboardInterrupt:
74 for line
in open(trace_path('trace_pipe'), 'r'):
75 sys
.stdout
.write(line
)
76 except KeyboardInterrupt:
80 print 'Usage: %s start [buffer_size_kb] | stop | dump | tail' % sys
.argv
[0]
81 print 'Control the KVM flight recorder tracing.'
89 if cmd
== '--version':
90 print 'kvm_flightrecorder version 1.0'
93 if not os
.path
.isdir(tracing_dir
):
94 print 'Unable to tracing debugfs directory, try:'
95 print 'mount -t debugfs none /sys/kernel/debug'
97 if not os
.access(tracing_dir
, os
.W_OK
):
98 print 'Unable to write to tracing debugfs directory, please run as root'
102 stop_tracing() # clean up first
104 if len(sys
.argv
) == 3:
106 buffer_size_kb
= int(sys
.argv
[2])
108 print 'Invalid per-cpu trace buffer size in KB'
110 write_file(trace_path('buffer_size_kb'), str(buffer_size_kb
))
111 print 'Per-CPU ring buffer size set to %d KB' % buffer_size_kb
114 print 'KVM flight recorder enabled'
117 print 'KVM flight recorder disabled'
125 if __name__
== '__main__':