that this could cause a very large overhead, but if
the kernel is also configured with dynamic function
tracing (CONFIG_DYNAMIC_FTRACE) then these calls,
when not in use, are converted at run time to nops.
This allows the function tracer to have zero overhead
when not in use. If you do not understand this part,
don’t worry, you do not need to understand the im-
plementation to use it. Just realize that enabling the
dynamic function tracer gives you great power with
no overhead.
4.2 The Heisenberg Principle
Any computer scientist (or any scientist for that mat-
ter) should be aware of the Heisenberg Principle
[3]. Basically this means that the act of measuring
something can and will modify the result. This is es-
pecially true with the interrupt tracer and even more
so when the function tracer is enabled. The idea is to
trace the time interrupts are disabled, but by adding
a tracer to these core functions, it adds a little over-
head. By running with the function tracer, it adds
even more overhead to the time interrupts are dis-
abled, because we are tracing every function that is
called within the critical section.
You do not need to unconfigure the function
tracer to keep it from running while tracing inter-
rupt latency. There exists a proc file that lets you
disable the function tracer from running at run time.
# echo 0 > /proc/sys/kernel/ftrace_enabled
This will allow you to find something a bit closer
to the actual latency
1
. Listing 5 shows the result of
a latency trace with the function tracer disabled.
To get a good idea of the overhead, the bench-
mark test hackbench [4] can show the results well.
Running hackbench with the function tracer enabled
yields a test run time of 47.686 seconds and a max
latency of 171 microseconds (way above the max
that we allow for the real-time kernel). Running
hackbench with the function tracing disabled, yields
a test run of 34.361 seconds and a max latency of 30
microseconds
2
. Note: running hackbench with both
tracers disabled only took a running time of 9.774
seconds. I do not know the latency because it was
not being traced.
Note: when enabling or disabling the function
tracing for the latency tracers, it is best to reset the
tracer or it may take effect. That is, echo in nop into
the current_tracer file and irqsoff again.
5 Reading the Trace
Before we continue to the other tracers, a descrip-
tion of how to read the output is in order. The lines
in the Listings of 1, 2, 3 and 4 are numbered. We
will go through some of the lines and explain their
meanings.
Lines 001 through 018 is the latency tracer
header, and is annotated with a ’#’ at the begin-
ning of the line. Line 001 states the name of the
current plugin tracer. Line 003 has the kernel ver-
sion that is executing (ignore the trace version, that
has not changed in a long time). Line 005 has a bit
of information. Here we see that the latency trace
recorded a 70 microsecond time that interrupts were
disabled. This may be different than the last trace
entry, but not by much, due to the tracer writing
entries after it took the finishing time stamp. The
#170/170 means that there was 170 entries printed
out of 170 that were recorded. Since the latency
trace ftrace plugins are usually small
3
the two num-
bers should always match. But for other tracers, it is
quite possible to have the first number smaller than
the second due to the trace ring buffer overwriting
older data.
The CPU#0 shows that this latency happened
on CPU 0. Inside the parenthesis, the VP, KP,
SP and HP will always be zero since they are not
yet implemented. The M element shows what type
of preemption the kernel was configured at. Here
it is “preempt” but really should be “preempt-rt”.
Since the latency tracer has been replaced with the
upstream ftrace, this field has not been updated.
The other selections of preempt type are “desk-
top” for CONFIG
PREEMPT VOLUNTARY (ker-
nel preempts only at preemption points) or “server”
for CONFIG PREEMPT NONE (no preemption in-
side the kernel). The #P:2 shows that there were 2
online CPUS active.
Line 007 shows information about the task
that was executing when the latency was recorded.
The task here was “sirqtimer/0” with process id
5. The policy shows that it was running un-
der SCHED FIFO (1) where as 0 would be a
non real-time running the SCHED NORMAL policy.
SCHED RR is represented with 2, SCHED BATCH
is 3, and SCHED IDLE is 5. Because this is run-
ning under a real-time policy, the nice value can be
ignored. The rt_prio field is the real-time prio as
1
Note: you must have a space between the 0 and the > otherwise the shell will interpret it as a redirection of standard I/O.
2
hackbench did not even get on the radar in this run
3
170 is small compared to thousands that the function tracer can do.