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 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