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.TraceTrace analysis package:
lisa.analysisTrace 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