Rename EVENT_FALLBACK -> EVENT_SPAM_INDIR (XCC)
[akaros.git] / Documentation / profiling.txt
1 Akaros Profiling
2 ===========================
3 2015-07-15 Barret Rhoden (brho)
4
5 Contents
6 ---------------------------
7 "Oprofile"
8
9 "Oprofile"
10 ---------------------------
11 Akaros has a very basic sampling profiler, similar to oprofile.  The kernel
12 generates traces, which you copy off the machine and process on Linux.
13
14 To get started, make sure #K is mounted.  The basic ifconfig script will do
15 this, as will:
16
17 / $ bind -a \#K /prof/
18
19 You control the profiler with the kpctl file.  The general style is to start
20 the events that trigger a sample, such as a timer tick, then you start and stop
21 the profiling.  The distinction between the two steps is that one actually
22 fires the events (e.g. the timer IRQ), and the other enables *collection* of profiling info when those events occur.
23
24 The optimer command takes the core id (or "all"), followed by "on" or "off".
25 As with all good devices, if you echo garbage, in, you should get the usage as
26 an errstr.  That'll be kept up to date more than documentation.
27
28 / $ echo garbage > /prof/kpctl
29 echo failed: Unspecified, startclr|start|stop|clear|opstart|opstop|optimer
30
31 / $ echo optimer garbage > /prof/kpctl
32 echo failed: Unspecified, optimer [<0|1|..|n|all> <on|off>] [period USEC]
33
34 Let's set up the timer on core 0:
35
36 / $ echo optimer 0 on > /prof/kpctl
37
38 And then start oprofile system-wide.
39
40 / $ echo opstart > /prof/kpctl
41 Enable tracing on 0
42 Enable tracing on 1
43 Enable tracing on 2
44 Enable tracing on 3
45 Enable tracing on 4
46 Enable tracing on 5
47 Enable tracing on 6
48 Enable tracing on 7
49
50 Run whatever command you want, then stop the profiler.
51
52 / $ foo
53 / $ echo opstop > /prof/kpctl
54 Core 0 has data
55 After qibwrite in oprofile_cpubuf_flushone, opq len 303080
56
57 Might as well turn off the timers:
58 / $ echo optimer all off > /prof/kpctl
59
60 Now we need to extract the trace.  The easiest way is via 9p.
61 / $ cat /prof/kpoprofile > trace
62 / $ cp trace /mnt/
63
64 Once the trace has been read from kpoprofile, it cannot be read again.  The
65 read drains the kernel's trace buffer.
66
67 The trace that the kernel generates is in an Akaros-specific format.  There is
68 a go program at tools/profile/op2.go that translates from the Akaros format to
69 pprof format.  You could run this on Akaros, since we support Go programs, but
70 since we don't have a port of pprof, it's easier to do it all in Linux.
71
72 So now we're in linux, and say our 9p ufs server is rooted at mnt/netroot/.  Run op2:
73
74 (linux) $ op2 < mnt/netroot/trace > trace-pp
75
76 To get a sense for what the trace holds, you might want to start with looking at the raw addresses to distinguish between the kernel and the user.
77
78 (linux) $ pprof --addresses trace-pp
79 PPROF> top
80         (shows some addresses)
81
82 Say the majority of the addresses are user addresses:
83
84 (linux) $ pprof obj/tests/foo trace-pp
85 PPROF> top
86         (shows some functions)
87
88 Or you can visualize things:
89 (linux) $ pprof --evince obj/tests/foo trace-pp
90
91 The visualization is not of much user for user programs, since the kernel does
92 not record backtraces for userspace by default.  It's a little dangerous at the
93 moment.  In the future, we may have an op option to control whether or not the
94 kernel attempts a backtrace.
95
96 For more info on pprof, check out:
97 http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html