Kernel trace analysis#
Introduction#
LISA comes with a plethora of analysis functions based on Ftrace traces. We
convert the trace events into dataframes (polars.LazyFrame
and
pandas.DataFrame
are currently supported).
Trace#
Our Trace
takes an Ftrace trace.dat
file as input
(other text-based formats are also accepted, but mileage may vary since they
are ambiguous), and provides access to both the raw trace events, as well as
some dataframes (polars.LazyFrame
and pandas.DataFrame
) built
from analysing and aggregating trace events.
You can create one like so:
trace = Trace("path/to/trace.dat")
Raw trace events can be accessed like this:
trace.df_event("sched_switch")
Whereas analysis dataframes can be obtained like that:
# trace.ana.<analysis name>.<analysis method>
trace.ana.tasks.df_tasks_states()
Switching to polars
can be done with:
trace = Trace("path/to/trace.dat", df_fmt='polars-lazyframe')
Or from an existing Trace
object:
trace = Trace("path/to/trace.dat")
trace = trace.get_view(df_fmt='polars-lazyframe')
Then all the dataframe APIs will return polars.LazyFrame
instances
instead of pandas.DataFrame
.
Here are the main entry points in the trace analysis APIs:
Trace manipulation class:
lisa.trace.Trace
Trace analysis package:
lisa.analysis
Trace analysis base classes:
lisa.analysis.base
Available analysis#
Dataframes#
The majority of these dataframes are time-indexed (and if they aren’t, it will be called out in the docstring). This makes it easy to create dataframe slices to study specific trace windows.
Gallery#
cpus#
plot_context_switches()
#
Called on Trace
instances as trace.ana.cpus.plot_context_switches()
plot_orig_capacity()
#
Called on Trace
instances as trace.ana.cpus.plot_orig_capacity()
cpu=0
frequency#
plot_cpu_frequencies()
#
Called on Trace
instances as trace.ana.frequency.plot_cpu_frequencies()
average=True, cpu=0, overutilized=True
plot_cpu_frequency_residency()
#
Called on Trace
instances as trace.ana.frequency.plot_cpu_frequency_residency()
cpu=0, domain_label=False, pct=False
plot_cpu_frequency_transitions()
#
Called on Trace
instances as trace.ana.frequency.plot_cpu_frequency_transitions()
cpu=0, domain_label=False, pct=False
plot_domain_frequencies()
#
Called on Trace
instances as trace.ana.frequency.plot_domain_frequencies()
plot_domain_frequency_residency()
#
Called on Trace
instances as trace.ana.frequency.plot_domain_frequency_residency()
pct=False
plot_domain_frequency_transitions()
#
Called on Trace
instances as trace.ana.frequency.plot_domain_frequency_transitions()
pct=False
plot_peripheral_frequency()
#
Called on Trace
instances as trace.ana.frequency.plot_peripheral_frequency()
average=True, clk_name=aplclk
idle#
plot_cluster_idle_state_residency()
#
Called on Trace
instances as trace.ana.idle.plot_cluster_idle_state_residency()
cluster=[0, 3, 4, 5], pct=False
plot_clusters_idle_state_residency()
#
Called on Trace
instances as trace.ana.idle.plot_clusters_idle_state_residency()
pct=False
plot_cpu_idle_state_residency()
#
Called on Trace
instances as trace.ana.idle.plot_cpu_idle_state_residency()
cpu=0, pct=False
latency#
plot_activations()
#
Called on Trace
instances as trace.ana.latency.plot_activations()
task=big_0-0
plot_latencies_cdf()
#
Called on Trace
instances as trace.ana.latency.plot_latencies_cdf()
preempt=True, task=big_0-0, threshold_ms=1, wakeup=True
plot_latencies_histogram()
#
Called on Trace
instances as trace.ana.latency.plot_latencies_histogram()
bins=64, preempt=True, task=big_0-0, threshold_ms=1, wakeup=True
plot_latencies()
#
Called on Trace
instances as trace.ana.latency.plot_latencies()
preempt=True, task=big_0-0, threshold_ms=1, wakeup=True
plot_latency_bands()
#
Called on Trace
instances as trace.ana.latency.plot_latency_bands()
task=big_0-0
plot_runtimes()
#
Called on Trace
instances as trace.ana.latency.plot_runtimes()
task=big_0-0
load_tracking#
plot_cpus_signals()
#
Called on Trace
instances as trace.ana.load_tracking.plot_cpus_signals()
signals=['util', 'load']
plot_task_placement()
#
Called on Trace
instances as trace.ana.load_tracking.plot_task_placement()
task=big_0-0
plot_task_required_capacity()
#
Called on Trace
instances as trace.ana.load_tracking.plot_task_required_capacity()
task=big_0-0
plot_task_signals()
#
Called on Trace
instances as trace.ana.load_tracking.plot_task_signals()
signals=['util', 'load'], task=big_0-0
notebook#
plot_event_field()
#
Called on Trace
instances as trace.ana.notebook.plot_event_field()
event=cpu_frequency, field=state, filter_columns={'cpu_id': 0}
pixel6#
plot_power_meter()
#
Called on Trace
instances as trace.ana.pixel6.plot_power_meter()
metrics=['energy', 'power']
pixel9#
plot_power_meter()
#
Called on Trace
instances as trace.ana.pixel9.plot_power_meter()
metrics=['energy', 'power']
rta#
plot_latency()
#
Called on Trace
instances as trace.ana.rta.plot_latency()
task=big_0-0
plot_perf_index_histogram()
#
Called on Trace
instances as trace.ana.rta.plot_perf_index_histogram()
bins=30, task=big_0-0
plot_perf()
#
Called on Trace
instances as trace.ana.rta.plot_perf()
task=big_0-0
plot_phases()
#
Called on Trace
instances as trace.ana.rta.plot_phases()
task=big_0-0, wlgen_profile={'small_0':
plot_slack_histogram()
#
Called on Trace
instances as trace.ana.rta.plot_slack_histogram()
bins=30, task=big_0-0
status#
plot_overutilized()
#
Called on Trace
instances as trace.ana.status.plot_overutilized()
tasks#
plot_task_activation()
#
Called on Trace
instances as trace.ana.tasks.plot_task_activation()
duration=True, duty_cycle=False, height_duty_cycle=False, task=big_0-0, which_cpu=True
plot_task_residency()
#
Called on Trace
instances as trace.ana.tasks.plot_task_residency()
task=big_0-0
plot_task_total_residency()
#
Called on Trace
instances as trace.ana.tasks.plot_task_total_residency()
task=big_0-0
plot_tasks_activation()
#
Called on Trace
instances as trace.ana.tasks.plot_tasks_activation()
duration=False, duty_cycle=False, height_duty_cycle=False, which_cpu=True
plot_tasks_forks_heatmap()
#
Called on Trace
instances as trace.ana.tasks.plot_tasks_forks_heatmap()
bins=100
plot_tasks_forks()
#
Called on Trace
instances as trace.ana.tasks.plot_tasks_forks()
per_sec=False, window=0.01
plot_tasks_total_residency()
#
Called on Trace
instances as trace.ana.tasks.plot_tasks_total_residency()
ascending=False
plot_tasks_wakeups_heatmap()
#
Called on Trace
instances as trace.ana.tasks.plot_tasks_wakeups_heatmap()
bins=100
plot_tasks_wakeups()
#
Called on Trace
instances as trace.ana.tasks.plot_tasks_wakeups()
per_sec=False, window=0.01
thermal#
plot_cpu_cooling_states()
#
Called on Trace
instances as trace.ana.thermal.plot_cpu_cooling_states()
No plot available
plot_dev_freq_cooling_states()
#
Called on Trace
instances as trace.ana.thermal.plot_dev_freq_cooling_states()
No plot available
plot_thermal_zone_temperature()
#
Called on Trace
instances as trace.ana.thermal.plot_thermal_zone_temperature()
No plot available