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.
35 from __future__
import print_function
39 tracing_dir
= '/sys/kernel/debug/tracing'
41 def trace_path(*args
):
42 return os
.path
.join(tracing_dir
, *args
)
44 def write_file(path
, data
):
45 open(path
, 'wb').write(data
)
47 def enable_event(subsystem
, event
, enable
):
48 write_file(trace_path('events', subsystem
, event
, 'enable'), '1' if enable
else '0')
50 def enable_subsystem(subsystem
, enable
):
51 write_file(trace_path('events', subsystem
, 'enable'), '1' if enable
else '0')
54 enable_subsystem('kvm', True)
55 write_file(trace_path('tracing_on'), '1')
58 write_file(trace_path('tracing_on'), '0')
59 enable_subsystem('kvm', False)
60 write_file(trace_path('events', 'enable'), '0')
61 write_file(trace_path('current_tracer'), 'nop')
64 tracefile
= open(trace_path('trace'), 'r')
68 lines
= tracefile
.readlines(64 * 1024)
69 sys
.stdout
.writelines(lines
)
70 except KeyboardInterrupt:
75 for line
in open(trace_path('trace_pipe'), 'r'):
76 sys
.stdout
.write(line
)
77 except KeyboardInterrupt:
81 print('Usage: %s start [buffer_size_kb] | stop | dump | tail' % sys
.argv
[0])
82 print('Control the KVM flight recorder tracing.')
90 if cmd
== '--version':
91 print('kvm_flightrecorder version 1.0')
94 if not os
.path
.isdir(tracing_dir
):
95 print('Unable to tracing debugfs directory, try:')
96 print('mount -t debugfs none /sys/kernel/debug')
98 if not os
.access(tracing_dir
, os
.W_OK
):
99 print('Unable to write to tracing debugfs directory, please run as root')
103 stop_tracing() # clean up first
105 if len(sys
.argv
) == 3:
107 buffer_size_kb
= int(sys
.argv
[2])
109 print('Invalid per-cpu trace buffer size in KB')
111 write_file(trace_path('buffer_size_kb'), str(buffer_size_kb
))
112 print('Per-CPU ring buffer size set to %d KB' % buffer_size_kb
)
115 print('KVM flight recorder enabled')
118 print('KVM flight recorder disabled')
126 if __name__
== '__main__':