xref: /aosp_15_r20/external/perfetto/docs/data-sources/cpu-freq.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# CPU frequency and idle states
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerThis data source is available on Linux and Android (Since P).
4*6dbdd20aSAndroid Build Coastguard WorkerIt records changes in the CPU power management scheme through the
5*6dbdd20aSAndroid Build Coastguard WorkerLinux kernel ftrace infrastructure.
6*6dbdd20aSAndroid Build Coastguard WorkerIt involves three aspects:
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard Worker#### Frequency scaling
9*6dbdd20aSAndroid Build Coastguard Worker
10*6dbdd20aSAndroid Build Coastguard WorkerThere are two way to get CPU frequency data:
11*6dbdd20aSAndroid Build Coastguard Worker
12*6dbdd20aSAndroid Build Coastguard Worker1. Enabling the `power/cpu_frequency` ftrace event. (See
13*6dbdd20aSAndroid Build Coastguard Worker   [TraceConfig](#traceconfig) below). This will record an event every time the
14*6dbdd20aSAndroid Build Coastguard Worker   in-kernel cpufreq scaling driver changes the frequency. Note that this is not
15*6dbdd20aSAndroid Build Coastguard Worker   supported on all platforms. In our experience it works reliably on ARM-based
16*6dbdd20aSAndroid Build Coastguard Worker   SoCs but produces no data on most modern Intel-based platforms. This is
17*6dbdd20aSAndroid Build Coastguard Worker   because recent Intel CPUs use an internal DVFS which is directly controlled
18*6dbdd20aSAndroid Build Coastguard Worker   by the CPU, and that doesn't expose frequency change events to the kernel.
19*6dbdd20aSAndroid Build Coastguard Worker   Also note that even on ARM-based platforms, the event is emitted only
20*6dbdd20aSAndroid Build Coastguard Worker   when a CPU frequency changes. In many cases the CPU frequency won't
21*6dbdd20aSAndroid Build Coastguard Worker   change for several seconds, which will show up as an empty block at the start
22*6dbdd20aSAndroid Build Coastguard Worker   of the trace.
23*6dbdd20aSAndroid Build Coastguard Worker   We suggest always combining this with polling (below) to get a reliable
24*6dbdd20aSAndroid Build Coastguard Worker   snapshot of the initial frequency.
25*6dbdd20aSAndroid Build Coastguard Worker2. Polling sysfs by enabling the `linux.sys_stats` data source and setting
26*6dbdd20aSAndroid Build Coastguard Worker   `cpufreq_period_ms` to a value > 0. This will periodically poll
27*6dbdd20aSAndroid Build Coastguard Worker   `/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq` and record the
28*6dbdd20aSAndroid Build Coastguard Worker   current value in the trace buffer. Works on both Intel and ARM-based
29*6dbdd20aSAndroid Build Coastguard Worker   platforms.
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard WorkerOn most Android devices the frequency scaling is per-cluster (group of
32*6dbdd20aSAndroid Build Coastguard Workerbig/little cores) so it's not unusual to see groups of four CPUs changing
33*6dbdd20aSAndroid Build Coastguard Workerfrequency at the same time.
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker#### Available frequencies
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard WorkerIt is possible to record one-off also the full list of frequencies supported by
38*6dbdd20aSAndroid Build Coastguard Workereach CPU by enabling the `linux.system_info` data source. This will
39*6dbdd20aSAndroid Build Coastguard Workerrecord `/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies` when
40*6dbdd20aSAndroid Build Coastguard Workerthe trace recording start. This information is typically used to tell apart
41*6dbdd20aSAndroid Build Coastguard Workerbig/little cores by inspecting the
42*6dbdd20aSAndroid Build Coastguard Worker[`cpu_freq` table](/docs/analysis/sql-tables.autogen#cpu_freq).
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard WorkerThis is not supported on modern Intel platforms for the same aforementioned
45*6dbdd20aSAndroid Build Coastguard Workerreasons of `power/cpu_frequency`.
46*6dbdd20aSAndroid Build Coastguard Worker
47*6dbdd20aSAndroid Build Coastguard Worker#### Idle states
48*6dbdd20aSAndroid Build Coastguard Worker
49*6dbdd20aSAndroid Build Coastguard WorkerWhen no threads are eligible to be executed (e.g. they are all in sleep states)
50*6dbdd20aSAndroid Build Coastguard Workerthe kernel sets the CPU into an idle state, turning off some of the circuitry
51*6dbdd20aSAndroid Build Coastguard Workerto reduce idle power usage. Most modern CPUs have more than one idle state:
52*6dbdd20aSAndroid Build Coastguard Workerdeeper idle states use less power but also require more time to resume from.
53*6dbdd20aSAndroid Build Coastguard Worker
54*6dbdd20aSAndroid Build Coastguard WorkerNote that idle transitions are relatively fast and cheap, a CPU can enter and
55*6dbdd20aSAndroid Build Coastguard Workerleave idle states hundreds of times in a second.
56*6dbdd20aSAndroid Build Coastguard WorkerIdle-ness must not be confused with full device suspend, which is a stronger and
57*6dbdd20aSAndroid Build Coastguard Workermore invasive power saving state (See below). CPUs can be idle even when the
58*6dbdd20aSAndroid Build Coastguard Workerscreen is on and the device looks operational.
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard WorkerThe details about how many idle states are available and their semantic is
61*6dbdd20aSAndroid Build Coastguard Workerhighly CPU/SoC specific. At the trace level, the idle state 0 means not-idle,
62*6dbdd20aSAndroid Build Coastguard Workervalues greater than 0 represent increasingly deeper power saving states
63*6dbdd20aSAndroid Build Coastguard Worker(e.g., single core idle -> full package idle).
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard WorkerNote that most Android devices won't enter idle states as long as the USB
66*6dbdd20aSAndroid Build Coastguard Workercable is plugged in (the USB driver stack holds wakelocks). It is not unusual
67*6dbdd20aSAndroid Build Coastguard Workerto see only one idle state in traces collected through USB.
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard WorkerOn most SoCs the frequency has little value when the CPU is idle, as the CPU is
70*6dbdd20aSAndroid Build Coastguard Workertypically clock-gated in idle states. In those cases the frequency in the trace
71*6dbdd20aSAndroid Build Coastguard Workerhappens to be the last frequency the CPU was running at before becoming idle.
72*6dbdd20aSAndroid Build Coastguard Worker
73*6dbdd20aSAndroid Build Coastguard WorkerKnown issues:
74*6dbdd20aSAndroid Build Coastguard Worker
75*6dbdd20aSAndroid Build Coastguard Worker* The event is emitted only when the frequency changes. This might
76*6dbdd20aSAndroid Build Coastguard Worker  not happen for long periods of times. In short traces
77*6dbdd20aSAndroid Build Coastguard Worker  it's possible that some CPU might not report any event, showing a gap on the
78*6dbdd20aSAndroid Build Coastguard Worker  left-hand side of the trace, or none at all. Perfetto doesn't currently record
79*6dbdd20aSAndroid Build Coastguard Worker  the initial cpu frequency when the trace is started.
80*6dbdd20aSAndroid Build Coastguard Worker
81*6dbdd20aSAndroid Build Coastguard Worker* Currently the UI doesn't render the cpufreq track if idle states (see below)
82*6dbdd20aSAndroid Build Coastguard Worker  are not captured. This is a UI-only bug, data is recorded and query-able
83*6dbdd20aSAndroid Build Coastguard Worker  through trace processor even if not displayed.
84*6dbdd20aSAndroid Build Coastguard Worker
85*6dbdd20aSAndroid Build Coastguard Worker### UI
86*6dbdd20aSAndroid Build Coastguard Worker
87*6dbdd20aSAndroid Build Coastguard WorkerIn the UI, CPU frequency and idle-ness are shown on the same track. The height
88*6dbdd20aSAndroid Build Coastguard Workerof the track represents the frequency, the coloring represents the idle
89*6dbdd20aSAndroid Build Coastguard Workerstate (colored: not-idle, gray: idle). Hovering or clicking a point in the
90*6dbdd20aSAndroid Build Coastguard Workertrack will reveal both the frequency and the idle state:
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/cpu-frequency.png "CPU frequency and idle states in the UI")
93*6dbdd20aSAndroid Build Coastguard Worker
94*6dbdd20aSAndroid Build Coastguard Worker### SQL
95*6dbdd20aSAndroid Build Coastguard Worker
96*6dbdd20aSAndroid Build Coastguard WorkerAt the SQL level, both frequency and idle states are modeled as counters,
97*6dbdd20aSAndroid Build Coastguard WorkerNote that the cpuidle value 0xffffffff (4294967295) means _back to not-idle_.
98*6dbdd20aSAndroid Build Coastguard Worker
99*6dbdd20aSAndroid Build Coastguard Worker```sql
100*6dbdd20aSAndroid Build Coastguard Workerselect ts, t.name, cpu, value from counter as c
101*6dbdd20aSAndroid Build Coastguard Workerleft join cpu_counter_track as t on c.track_id = t.id
102*6dbdd20aSAndroid Build Coastguard Workerwhere t.name = 'cpuidle' or t.name = 'cpufreq'
103*6dbdd20aSAndroid Build Coastguard Worker```
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard Workerts | name | cpu | value
106*6dbdd20aSAndroid Build Coastguard Worker---|------|------|------
107*6dbdd20aSAndroid Build Coastguard Worker261187013242350 | cpuidle | 1 | 0
108*6dbdd20aSAndroid Build Coastguard Worker261187013246204 | cpuidle | 1 | 4294967295
109*6dbdd20aSAndroid Build Coastguard Worker261187013317818 | cpuidle | 1 | 0
110*6dbdd20aSAndroid Build Coastguard Worker261187013333027 | cpuidle | 0 | 0
111*6dbdd20aSAndroid Build Coastguard Worker261187013338287 | cpufreq | 0 | 1036800
112*6dbdd20aSAndroid Build Coastguard Worker261187013357922 | cpufreq | 1 | 1036800
113*6dbdd20aSAndroid Build Coastguard Worker261187013410735 | cpuidle | 1 | 4294967295
114*6dbdd20aSAndroid Build Coastguard Worker261187013451152 | cpuidle | 0 | 4294967295
115*6dbdd20aSAndroid Build Coastguard Worker261187013665683 | cpuidle | 1 | 0
116*6dbdd20aSAndroid Build Coastguard Worker261187013845058 | cpufreq | 0 | 1900800
117*6dbdd20aSAndroid Build Coastguard Worker
118*6dbdd20aSAndroid Build Coastguard WorkerThe list of known CPU frequencies, can be queried using the
119*6dbdd20aSAndroid Build Coastguard Worker[`cpu_freq` table](/docs/analysis/sql-tables.autogen#cpu_freq).
120*6dbdd20aSAndroid Build Coastguard Worker
121*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
122*6dbdd20aSAndroid Build Coastguard Worker
123*6dbdd20aSAndroid Build Coastguard Worker```protobuf
124*6dbdd20aSAndroid Build Coastguard Worker# Event-driven recording of frequency and idle state changes.
125*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
126*6dbdd20aSAndroid Build Coastguard Worker    config {
127*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.ftrace"
128*6dbdd20aSAndroid Build Coastguard Worker        ftrace_config {
129*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "power/cpu_frequency"
130*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "power/cpu_idle"
131*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "power/suspend_resume"
132*6dbdd20aSAndroid Build Coastguard Worker        }
133*6dbdd20aSAndroid Build Coastguard Worker    }
134*6dbdd20aSAndroid Build Coastguard Worker}
135*6dbdd20aSAndroid Build Coastguard Worker
136*6dbdd20aSAndroid Build Coastguard Worker# Polling the current cpu frequency.
137*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
138*6dbdd20aSAndroid Build Coastguard Worker    config {
139*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.sys_stats"
140*6dbdd20aSAndroid Build Coastguard Worker        sys_stats_config {
141*6dbdd20aSAndroid Build Coastguard Worker            cpufreq_period_ms: 500
142*6dbdd20aSAndroid Build Coastguard Worker        }
143*6dbdd20aSAndroid Build Coastguard Worker    }
144*6dbdd20aSAndroid Build Coastguard Worker}
145*6dbdd20aSAndroid Build Coastguard Worker
146*6dbdd20aSAndroid Build Coastguard Worker# Reporting the list of available frequency for each CPU.
147*6dbdd20aSAndroid Build Coastguard Workerdata_sources {
148*6dbdd20aSAndroid Build Coastguard Worker    config {
149*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.system_info"
150*6dbdd20aSAndroid Build Coastguard Worker    }
151*6dbdd20aSAndroid Build Coastguard Worker}
152*6dbdd20aSAndroid Build Coastguard Worker```
153*6dbdd20aSAndroid Build Coastguard Worker
154*6dbdd20aSAndroid Build Coastguard Worker### Full-device suspend
155*6dbdd20aSAndroid Build Coastguard Worker
156*6dbdd20aSAndroid Build Coastguard WorkerFull device suspend happens when a laptop is put in "sleep" mode (e.g. by
157*6dbdd20aSAndroid Build Coastguard Workerclosing the lid) or when a smartphone display is turned off for enough time.
158*6dbdd20aSAndroid Build Coastguard Worker
159*6dbdd20aSAndroid Build Coastguard WorkerWhen the device is suspended, most of the hardware units are turned off entering
160*6dbdd20aSAndroid Build Coastguard Workerthe highest power-saving state possible (other than full shutdown).
161*6dbdd20aSAndroid Build Coastguard Worker
162*6dbdd20aSAndroid Build Coastguard WorkerNote that most Android devices don't suspend immediately after dimming the
163*6dbdd20aSAndroid Build Coastguard Workerdisplay but tend to do so if the display is forced off through the power button.
164*6dbdd20aSAndroid Build Coastguard WorkerThe details are highly device/manufacturer/kernel specific.
165*6dbdd20aSAndroid Build Coastguard Worker
166*6dbdd20aSAndroid Build Coastguard WorkerKnown issues:
167*6dbdd20aSAndroid Build Coastguard Worker
168*6dbdd20aSAndroid Build Coastguard Worker* The UI doesn't display clearly the suspended state. When an Android device
169*6dbdd20aSAndroid Build Coastguard Worker  suspends it looks like as if all CPUs are running the kmigration thread and
170*6dbdd20aSAndroid Build Coastguard Worker  one CPU is running the power HAL.
171