Perfetto - 18 - CPU frequency and idle states CPU频率和空闲状态
Perfetto - 18 - CPU frequency and idle states CPU频率和空闲状态
Frequency scaling的翻译为“频率缩放”,它是指通过改变CPU的时钟频率来控制CPU的功耗和性能的一种技术。在现代的计算机系统中,CPU是消耗大量电力的设备,频率缩放技术可以通过降低CPU的时钟频率来降低功耗,并延长电池寿命。同时,当需要更高的性能时,频率缩放技术也可以通过增加CPU的时钟频率来提高CPU的性能。频率缩放技术通常由操作系统内核或硬件设备自动控制,并在不同的应用程序或任务之间动态调整CPU的时钟频率,以实现更好的平衡功耗和性能之间的权衡。
Basic
该数据源在Linux和Android (Since P)上可用。它通过Linux内核ftrace基础设施记录CPU电源管理方案的变化。它涉及三个方面:
频率扩展
获取CPU频率数据有两种方式:
- 开启power/cpu_frequency ftrace事件。(参见下面的TraceConfig)。这将在内核内cpufreq缩放驱动程序每次改变频率时记录一个事件。请注意,并非所有平台都支持这一点。根据我们的经验,它在基于arm的soc上可靠地工作,但在大多数基于英特尔的现代平台上不产生数据。这是因为最近的Intel CPU使用的是由CPU直接控制的内部DVFS,这不会将频率变化事件暴露给内核。还要注意,即使在基于arm的平台上,事件也只在CPU频率发生变化时才会触发。在许多情况下,CPU频率几秒钟内都不会改变,它将在跟踪开始时显示为一个空块。我们建议始终将此与轮询(如下)结合起来,以获得初始频率的可靠快照。
- 通过启用linux轮询sysfs。Sys_stats数据源,并将cpufreq_period_ms设置为值>0. 这将周期性地轮询/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq,并在跟踪缓冲区中记录当前值。适用于基于Intel和arm的平台。
在大多数Android设备上,频率缩放是按集群(大/小核组)进行的,所以四个cpu组同时改变频率是很正常的。
可用的频率
通过启用linux,可以一次性记录每个CPU支持的频率的完整列表。System_info数据源。这将在跟踪记录开始时记录/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies。该信息通常用于通过检查cpu_freq表来区分大/小核。
由于前面提到的power/cpu_frequency的原因,现代英特尔平台不支持这一功能。
空闲状态
当没有线程有资格被执行时(例如,它们都处于睡眠状态),内核将CPU设置为空闲状态,关闭一些电路以减少空闲电源的使用。大多数现代cpu都有不止一个空闲状态:更深层的空闲状态耗电量更少,但也需要更多时间恢复。
请注意,空闲转换是相对快速和廉价的,CPU可以在一秒钟内进入和离开空闲状态数百次。不应将空闲状态与完全设备挂起相混淆,后者是一种更强且更具侵入性的省电状态(见下文)。即使屏幕开着,设备看起来也在运行,cpu也可能处于空闲状态。
关于有多少空闲状态可用以及它们的语义是高度特定于CPU/SoC的。在跟踪级别,空闲状态0表示非空闲,大于0的值表示越来越深的省电状态(例如,单核空闲->全包空闲)。
请注意,只要插入USB线,大多数Android设备就不会进入空闲状态(USB驱动程序堆栈拥有wakelocks)。在通过USB收集的痕迹中只看到一个空闲状态是很正常的。
在大多数soc上,当CPU空闲时,频率没有什么价值,因为CPU通常处于空闲状态。在这些情况下,跟踪中的频率恰好是CPU在空闲之前运行的最后一个频率。
已知问题:
只有在频率发生变化时才会触发该事件。这种情况可能不会持续很长一段时间。在简短的跟踪中,有些CPU可能不报告任何事件,在跟踪的左侧显示一个间隙,或者根本不报告。Perfetto当前不记录跟踪启动时的初始cpu频率。
目前,如果未捕获空闲状态(见下文),UI不会呈现cpufreq跟踪。这是一个只有ui的错误,即使没有显示,数据也可以通过跟踪处理器记录和查询。
UI
在用户界面中,CPU频率和空闲状态显示在同一轨道上。轨道的高度表示频率,颜色表示空闲状态(彩色表示非空闲,灰色表示空闲)。悬停或点击轨道上的一个点将显示频率和空闲状态:
SQL
TraceConfig
Full-device suspend
当笔记本电脑处于“睡眠”模式(例如关闭盖子)或智能手机显示屏关闭足够时间时,就会发生设备完全暂停。
当设备挂起时,大多数硬件单元都关闭,进入尽可能高的省电状态(完全关机除外)。
请注意,大多数Android设备在调暗显示器后不会立即暂停,但如果通过电源按钮强制关闭显示器,则倾向于这样做。细节是高度特定于设备/制造商/内核的。
已知问题:
UI没有清楚地显示挂起状态。当Android设备挂起时,看起来好像所有CPU都在运行kmigration线程,而一个CPU在运行power HAL。
Reference
- https://perfetto.dev/docs/data-sources/cpu-freq