功耗分析¶
本文介绍了有关功耗分析的重要背景信息,重点关注台式机和笔记本电脑中使用的英特尔处理器。它作为任何首次进行功耗分析的人员的起点。
基本物理概念¶
在物理学中,功率 是执行功 的速率。它等同于单位时间内消耗的能量{.mw-redirect}。在国际单位制中,能量以焦耳为单位测量,功率以瓦特为单位测量,相当于每秒焦耳。
尽管功率是一个瞬时概念,但在实践中,其测量是以非瞬时方式确定的,即通过将能量量除以非无限小的时段。严格来说,这种计算给出了平均功率,但在上下文明确的情况下,通常将其称为功率。
在计算环境中,一个充满电的移动设备电池(如笔记本电脑或智能手机中的电池)存储了一定量的能量,并且该存储能量耗尽的速度取决于移动设备的功耗。这反过来又取决于设备上运行的软件。Web 浏览器是流行的应用程序,并且可能非常耗电,因此会显著影响电池续航时间。因此,值得优化(即减少)Firefox 和 Firefox OS 造成的功耗。
英特尔处理器基础¶
处理器布局¶
以下图表(来自英特尔功耗控制文档)显示了使用最新英特尔处理器的机器是如何构建的。
要点如下。
C 状态¶
英特尔处理器具有积极的节电功能。首先是能够在活动状态和空闲状态之间频繁切换(每秒数千次),并且实际上有几种不同类型的空闲状态。这些不同的状态称为C 状态。 C0 是活动/繁忙状态,其中正在执行指令。其他状态具有较高的数字,反映出越来越深的空闲状态。空闲状态越深,功耗越低,但从唤醒状态唤醒所需的时间也越长。
注意:ACPI 标准 指定了四种状态,C0、C1、C2 和 C3。英特尔将这些状态映射到处理器特定的状态,例如 C0、C1、C2、C6 和 C7,并且许多工具使用后一种名称报告 C 状态。确切的关系很混乱,英特尔优化手册 的第 13 章提供了更多详细信息。重要的是,C0 始终是活动状态,对于空闲状态,较高的数字始终意味着功耗更低。
关于 C 状态需要注意的另一点是,它们适用于核心和整个封装——即,如果所有核心都处于空闲状态,则整个封装也可以变为空闲状态,这可以进一步降低功耗。
封装或核心在空闲 C 状态下花费的时间分数称为C 状态驻留时间。这是一个误导性术语——活动状态 C0 也是一个 C 状态——但它仍然很常见。
英特尔处理器具有包含不同 C 状态下花费时间测量的模型特定寄存器 (MSR),并且诸如powermetrics(Mac)、powertop 和turbostat(Linux)之类的工具可以公开此信息。
唤醒发生在核心或封装从空闲状态转换到活动状态时。当操作系统由于某种事件而安排进程运行时,就会发生这种情况。唤醒的常见原因包括计划的计时器到期和被阻塞的 I/O 系统调用接收数据。保持 C 状态驻留对于保持低功耗至关重要,因此减少唤醒频率是降低功耗的最佳方法之一。
C 状态存在的一个后果是,在功耗分析期间进行的观察——甚至比其他类型的分析更甚——可能会干扰正在观察的内容。例如,Gecko Profiler 使用计时器以 1000Hz 的频率采集样本。这些样本中的每一个都可能触发唤醒,这会消耗能量并掩盖 Firefox 的自然唤醒模式。因此,将功耗测量集成到 Gecko Profiler 中不太可能有用,而其他功耗分析工具通常使用低得多的采样率(例如 1Hz)。
P 状态¶
英特尔处理器还支持多个P 状态。P0 是处理器以最大频率和电压运行的状态,而编号较高的 P 状态以较低的频率和电压运行以降低功耗。处理器可以有几十个 P 状态,但转换由硬件和操作系统控制,因此与 C 状态相比,P 状态对应用程序开发人员的兴趣较小。
功耗分析方法¶
本节旨在整合以上所有信息,并提供一套查找、诊断和修复高功耗案例的策略。
首先,所有测量最好都在一台安静的机器上进行,除了感兴趣的程序之外,几乎没有其他程序在运行。如果情况并非如此,则全局测量尤其可能完全歪曲和不可靠。
查找或确认 Firefox 功耗较高的测试用例。“高”最容易通过与其他浏览器进行比较来衡量。使用功耗测量或估计(例如,通过 tools/power/rapl,或 Mac 上的
mach power
,或 Windows 上的 Intel Power Gadget)进行比较。避免使用质量较低的测量,尤其是活动监视器中的“能源影响”。尝试使用差分分析来缩小问题范围。
尝试启用或禁用硬件加速;启用或禁用 e10s;启用或禁用 Flash。
尝试将相关标签置于前台与后台。
如果问题出现在特定网站上,请尝试保存该网站的本地副本,然后手动删除 HTML 元素,以查看特定页面功能是否导致了问题。
许多功耗问题是由高 CPU 使用率或高唤醒频率引起的。使用其中一种低上下文工具来确定是否属于这种情况(例如,在 Mac 上使用 powermetrics)。如果是,则随后使用提供高上下文测量的工具,这希望能识别出问题的原因。
对于高 CPU 使用率,可以使用许多分析器:Firefox 的开发者工具分析器、Gecko 分析器或通用性能分析器。
对于高唤醒计数,请使用 dtrace 或 perf 或 TimerFirings 日志记录。
在 Mac 上使用图形的工作负载中,活动监视器的“能源”选项卡可以告诉您是否正在使用高性能 GPU,它比集成 GPU 消耗更多的电能。
如果 CPU 使用率和唤醒频率均未识别出问题,则可能需要更多的创造力。查看其他测量(C 状态驻留时间、GPU 使用率等)可能会有所帮助。
动画有时会导致高功耗。Firefox Devtools 中的 动画检查器 可以识别它们。或者,此处 解释了一位开发者如何以艰难的方式诊断两个与动画相关的问题(这需要真正的平台专业知识)。
功耗问题的近似原因通常并不难找到。解决它们通常是难点。祝你好运。
如果您通过改进代理测量来解决问题,则应验证它是否也改进了功耗测量或估计。这样您就知道修复产生了真正的效果。
进一步阅读¶
英特尔优化手册 的第 13 章详细介绍了如何优化功耗。尤其是第 13.5 节(“为智能功耗调整软件”)值得一读。