美文网首页perfetto 官方文档翻译
Perfetto 翻译第十六篇-数据来源-CPU频率变化

Perfetto 翻译第十六篇-数据来源-CPU频率变化

作者: David_zhou | 来源:发表于2023-10-12 09:35 被阅读0次

    前言:虽然有翻译软件,虽然有chatgpt,毕竟语言隔阂,对这个工具还是一知半解,因此想通过翻译的方式和大家来一起学习下Perfetto这个强大的工具

    目录

    #####################以下分割线#####################
    英文原文在这里

    此数据源在 Linux 和 Android 上可用(自系统P起)。它通过 Linux 内核 ftrace 基础结构记录 CPU 电源管理方案中的变化。它涉及三个方面:

    频率变化

    有两种方法可以获取 CPU 频率数据:

    1. 启用 power/cpu_frequency ftrace 事件。(请参阅下面的 TraceConfig )。这将在每次内核 cpufreq 缩放驱动程序更改频率时记录一个事件。请注意,并非所有平台都支持此功能。根据我们的经验,它在基于 ARM 的 SoC 上可靠运行,但在大多数基于 Intel 的现代平台上不会生成任何数据。这是因为最近的英特尔 CPU 使用由 CPU 直接控制的内部 DVFS,并且不会向内核公开频率变化事件。另请注意,即使在基于 ARM 的平台上,也仅在 CPU 频率更改时发出事件。在许多情况下,CPU 频率在几秒钟内不会更改,这将在trace开始时显示为空块。我们建议始终将其与轮询(如下)相结合,以获得初始频率的可靠快照。

    2. 通过启用 linux.sys_stats 数据源并将值设置为 cpufreq_period_ms 0 >来轮询 sysfs。这将定期轮询 /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq 并记录跟踪缓冲区中的当前值。适用于基于英特尔和 ARM 的平台。

    在大多数 Android 设备上,频率缩放是按集群(大/小内核组)进行的,因此看到四个 CPU 组同时更改频率并不罕见。

    可用频率

    通过启用 linux.system_info 数据源,还可以一次性记录每个CPU支持的频率的完整列表。当开始记录trace时 ,会记录/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies 。此信息通常用于通过检查 [cpu_freq 表](https://perfetto.dev/docs/analysis/sql-tables#cpu_freq)来区分大/小核心。

    由于上述相同 power/cpu_frequency 原因,现代英特尔平台不支持此功能。

    空闲状态

    当没有线程有资格执行时(例如,它们都处于睡眠状态),内核将CPU设置为空闲状态,关闭一些电路以减少电源的消耗。大多数现代 CPU 都有不止一种空闲状态:更深的空闲状态使用更少的功率,但也需要更多的时间才能恢复。

    请注意,idle转换相对快速且轻量级,CPU 可以在一秒钟内进入和离开idle状态数百次。idle不能与完全设备挂起混淆,后者是一种更强、更具侵入性的节能状态(见下文)。即使屏幕打开且设备看起来正常运行,CPU 也可能处于空闲状态。

    有多少idle状态可用及其语义的详细信息高度特定于 CPU/SoC。在trace级别,空闲状态 0 表示非空闲状态,大于 0 的值表示越来越深的节能状态(例如,单核空闲 ->全部空闲)。

    请注意,只要插入 USB 线,大多数 Android 设备就不会进入idle状态(USB 驱动程序堆栈保持唤醒锁)。在通过 USB 收集的trace中只看到一种空闲状态并不罕见。

    在大多数 SoC 上,当 CPU 空闲时,频率几乎没有价值,因为 CPU 通常在空闲状态下进行时钟门控。在这些情况下,trace中的频率恰好是 CPU 在空闲之前运行的最后一个频率。

    已知问题:

    • 仅当频率更改时,才会发出该事件。这可能不会在很长一段时间内发生。在简短的跟踪中,某些 CPU 可能不报告任何事件,因此在trace的左侧显示间隙,或者根本没有。Perfetto 当前不会在跟踪启动时记录初始 CPU 频率。

    • 如果未捕获idle状态(见下文),UI 不会呈现 cpufreq 轨迹。这仅是 UI 的 bug,即使未显示,也可以通过trace processor记录和查询数据。

    UI

    在 UI 中,CPU 频率和idle状态显示在同一轨道上。轨道的高度表示频率,颜色表示空闲状态(彩色:非idle,灰色:idle)。将鼠标悬停或单击轨迹中的某个点将显示频率和idle状态:


    cpu-frequency.png
    SQL

    在 SQL 级别,频率和空闲状态都表示为计数器,请注意,cpuidle 值 0xffffffff (4294967295) 表示返回非空闲状态

    select ts, t.name, cpu, value from counter as c
    left join cpu_counter_track as t on c.track_id = t.id
    where t.name = 'cpuidle' or t.name = 'cpufreq'
    
    截屏2023-10-12 23.30.07.png
    可以使用该 cpu_freq 表查询已知 CPU 频率的列表。
    TraceConfig 跟踪配置
    # Event-driven recording of frequency and idle state changes.
    data_sources: {
        config {
            name: "linux.ftrace"
            ftrace_config {
                ftrace_events: "power/cpu_frequency"
                ftrace_events: "power/cpu_idle"
                ftrace_events: "power/suspend_resume"
            }
        }
    }
    
    # Polling the current cpu frequency.
    data_sources: {
        config {
            name: "linux.sys_stats"
            sys_stats_config {
                cpufreq_period_ms: 500
            }
        }
    }
    
    # Reporting the list of available frequency for each CPU.
    data_sources {
        config {
            name: "linux.system_info"
        }
    }
    
    全设备挂起

    当笔记本电脑进入“睡眠”模式(例如,合上盖子)或智能手机显示屏关闭足够长的时间时,会发生设备完全挂起。

    当设备挂起时,大多数硬件单元将关闭,进入可能的最高节能状态(完全关闭除外)。

    请注意,大多数 Android 设备在调暗显示器后不会立即挂起,但如果通过电源按钮强制关闭显示器,往往会这样做。详细信息高度依赖设备/制造商/内核。

    已知问题:

    • UI 不会清楚地显示挂起状态。当 Android 设备挂起时,看起来好像所有 CPU 都在运行 kmigration 线程,而一个 CPU 正在运行电源 HAL。

    #####################以上分割线#####################

    后记:
    1 本次主要使用百度翻译,虽然被骂,但至少翻译这个工具降低了门槛。
    2 英文文档中的长难句真的是又长又难,基于百度的翻译,然后自己再调整下,水平实在有限。
    3 技术背景知识不够,有些专有名词不知道怎么翻译,也不知道百度翻译的是否准确,功夫在诗外。
    4 万事开头难,中间难不难,还不知道。中间的事后面再说,正确一天翻译一篇。
    5 虽然可能会有人不屑,但总要有人去做不起眼的小事。
    6 google 厉害,这个perfetto 工具也很厉害。君子善假于物也。
    7 工具的使用是最简单的入门,背后还有更多的东西值得学习。
    8 水平实在有限,闻过则喜,希望有更多的人反馈,期待更好的建议

    相关文章

      网友评论

        本文标题:Perfetto 翻译第十六篇-数据来源-CPU频率变化

        本文链接:https://www.haomeiwen.com/subject/ofmnbdtx.html