文章目录
第6章 能效性
能量有点像金钱:如果你有盈余,就可以以各种方式支配它,但根据本世纪初人们所信奉的经典定律,你是不允许出现透支情况的。
——斯蒂芬·霍金(Stephen Hawking )
过去,计算机所消耗的能源似乎是免费且无穷无尽的——至少我们的行为表现得好像是这样。以往,架构师们很少会过多考虑软件的能源消耗问题。但如今,那些日子已经一去不复返了。随着移动设备成为大多数人主要的计算工具,占据主导地位,随着物联网在工业和政府领域的应用日益广泛,以及云服务作为我们计算基础设施的支柱无处不在,能源已经成为架构师们再也无法忽视的一个问题。电力不再是“免费”且取之不尽的了。移动设备的能源效率与我们每个人都息息相关。同样,云服务提供商也越来越关注其服务器集群的能源效率。2016年,有报道称,全球数据中心的能源消耗占比(40%)高于整个英国的能源消耗——约占全球能源总消耗的3%。而最近的估计显示,这一占比已经高达10%。运行大型数据中心,尤其是为其降温所产生的能源成本,促使人们开始考虑将整个数据中心搬到太空的成本,因为在太空中降温无需额外费用,而且太阳能够提供无穷无尽的能量。按照如今的发射成本来计算,从经济角度看,这种做法实际上已经开始显得颇具优势。值得注意的是,将服务器集群设置在水下以及北极气候环境中的情况已经成为现实。
无论是在低端设备还是高端设备领域,计算设备的能源消耗都已成为我们需要考虑的一个问题。这意味着,作为架构师,我们现在需要在设计系统时所考虑的众多相互矛盾的质量属性清单中,再加上 “能源效率” 这一项。而且,和其他所有质量属性一样,我们需要考虑一些不容小觑的权衡因素:能源消耗与性能、可用性、可修改性或产品上市时间之间的权衡。因此,将能源效率视为一个至关重要的质量属性十分重要,原因如下:
- 若要掌控任何一项重要的系统质量属性,都需要采取架构层面的方法,能源效率也不例外。如果缺乏用于监控和管理能源的系统级技术,开发人员就只能自行去摸索。最好的情况是,这会导致采用一种临时拼凑的方式来提高能源效率,从而构建出一个难以维护、难以衡量且难以发展演进的系统。最坏的情况是,所采用的方法根本无法可靠地实现预期的能源效率目标。
- 大多数架构师和开发人员并未将能源效率视为一个值得关注的质量属性,因此也不知道如何围绕它进行工程设计和编码。更根本的是,他们缺乏对能源效率需求的理解 —— 不知道如何收集这些需求,以及如何分析其完整性。在如今的教育课程中,能源效率并未被作为程序员需要关注的问题来教授,甚至通常都不会提及。结果是,有些学生可能在获得工程学或计算机科学学位毕业时,都从未接触过这些问题。
- 大多数架构师和开发人员缺乏合适的设计理念,如模型、模式、策略等,用于进行提高能源效率的设计,以及在运行时对其进行管理和监控。但由于能源效率是软件工程领域相对较新的关注点,这些设计理念仍处于起步阶段,目前还没有相关的概念汇编。
云平台通常无需担心能源耗尽的问题(除非在灾难场景下),而对于移动设备和某些物联网设备的用户来说,这却是每天都要面对的问题。在云环境中,扩展和缩减规模是核心能力,因此必须定期就最优资源分配做出决策。对于物联网设备而言,其尺寸、外形规格和散热情况都会限制其设计空间 —— 没有空间容纳体积庞大的电池。此外,预计在未来十年内部署的物联网设备数量极其庞大,这使得它们的能源消耗成为一个令人担忧的问题。
在所有这些情况下,都必须在能源效率与性能和可用性之间寻求平衡,这就要求工程师有意识地权衡这些因素。在云环境中,分配更多的资源,如更多的服务器、更多的存储等,能够提升性能,并增强对单个设备故障的抵御能力,但代价是能源消耗和资金支出的增加。在移动设备和物联网的场景中,通常无法选择分配更多的资源(尽管可以将计算负担从移动设备转移到云后端),所以权衡往往集中在能源效率与性能和可用性之间。最后,在所有场景中,都需要在能源效率与可构建性和可修改性之间进行权衡。
6.1 能效性通用场景
基于这些考量,我们现在能够确定能源效率通用场景的各个部分,具体内容如 表 6.1 所示。
表 6.1 能源效率通用场景
场景部分 | 描述 | 可能的值 |
---|---|---|
来源 | 这明确了是谁或什么事物提出或发起了节约能源或管理能源的请求。 | 终端用户、经理、系统管理员、自动化代理 |
触发事件 | 节约能源的请求。 | 总使用量、最大瞬时使用量、平均使用量等等。 |
构件 | 这明确了需要管理的内容。 | 特定的设备、服务器、虚拟机、集群等等。 |
环境 | 能源通常在运行时进行管理,但基于系统的不同特性,也存在许多值得关注的特殊情况。 | 运行时、已连接、电池供电、低电量模式、节能模式 |
响应 | 系统会采取哪些行动来节约或管理能源使用。 | 以下一项或多项:
|
响应度量 | 这些措施围绕着节省或消耗的能源量,以及对其他功能或质量属性的影响展开。 | 所管理或节省的能源依据以下方面来衡量:
|
图6.1 展示了一个具体的能源效率场景:一位经理希望在运行时通过在非高峰时段释放未使用的资源来节约能源。系统在释放资源的同时,将数据库查询的最坏情况延迟保持在2秒以内,平均节省了所需总能源的50%。
图6.1 能源效率示例场景
6.2 能效性策略
能源效率场景的触发因素是在仍能提供所需功能(尽管不一定是全部功能)的同时,产生节约或管理能源的需求。如果在可接受的时间、成本和质量限制范围内实现了能源方面的应对措施,那么这个场景就算是成功的。我们在 图6.2 中展示了这种简单的关系,也就是能源效率策略的目标。
图 6.2 能源效率策略的目标
能源效率的核心在于有效地利用资源。我们将相关策略大致分为三大类:资源监测、资源分配以及资源适配(图 6.3)。这里所说的 “资源”,指的是在提供功能的同时会消耗能源的计算设备。这与 第 9 章 中 “硬件” 资源的定义类似,其中包括中央处理器(CPU)、数据存储设备、网络通信设备以及内存。
图 6.3 能源效率策略
监控资源
你无法管理无法度量的事物,因此我们从资源监测入手。资源监测的策略包括计量、静态分类和动态分类。
- 计量:计量策略是指通过传感器基础设施近乎实时地收集有关计算资源能源消耗的数据。最粗略的层面,可以从整个数据中心的电表来测量其能源消耗。对于单个服务器或硬盘,可以使用安培计或电度表等外部工具进行测量,也可以使用内置工具,比如带计量功能的机架式电源分配单元(PDU)、专用集成电路(ASIC)等提供的工具。在电池供电的系统中,电池剩余电量可以通过电池管理系统来确定,这是现代电池的一个组成部分。
- 静态分类:有时实时数据收集并不可行。例如,如果一个机构使用的是外部云服务,可能无法直接获取实时能源数据。静态分类使我们能够通过对所使用的计算资源及其已知的能源特性进行编目来估算能源消耗,比如,一个存储设备每次读取操作所消耗的能量。这些特性可以从基准测试中获取,或者参考制造商的规格说明。
- 动态分类:在计算资源的静态模型不够用的情况下,可能需要动态模型。与静态模型不同,动态模型根据诸如工作负载等瞬态条件的信息来估算能源消耗。这个模型可以是简单的表格查询,也可以是基于先前执行过程中收集的数据建立的回归模型,或者是一个模拟模型。
分配资源
资源分配是指在考虑能源消耗的情况下,分配资源来执行任务。资源分配的策略包括减少使用、发现和调度。
- 减少使用:在设备层面,可以通过特定于设备的操作来减少能源使用,比如降低显示器的刷新率或调暗背景亮度。当需求不再需要某些资源时,移除或停用这些资源是另一种降低能源消耗的方法。这可能包括使硬盘进入休眠状态、关闭 CPU 或服务器、降低 CPU 的时钟频率运行,或者切断未使用的处理器模块的电源。还可以采取将虚拟机迁移到最少数量的物理服务器上(整合),并关闭闲置的计算资源这种形式。在移动应用中,假设通信的能源消耗低于计算的能源消耗,那么将部分计算任务发送到云端也可以实现节能。
- 发现:正如我们将在 第 7 章 中看到的,发现服务会将(来自客户端的)服务请求与服务提供商进行匹配,支持对这些服务的识别和远程调用。传统上,发现服务是根据服务请求的描述(通常是一个 API)来进行匹配的。在能源效率的背景下,这个请求可以标注能源信息,使请求者能够根据服务提供商(资源)的(可能是动态的)能源特性来选择服务提供商。对于云服务,这些能源信息可以存储在一个 “绿色服务目录” 中,该目录由计量、静态分类或动态分类(资源监测策略)所提供的信息填充。对于智能手机,这些信息可以从应用商店获取。目前,这类信息充其量只是临时的,而且在服务 API 中通常根本不存在。
- 调度资源:调度是将任务分配给计算资源。正如我们将在 第 9 章 中看到的,调度资源策略可以提高性能。在能源方面,考虑到任务约束并尊重任务优先级,它可以用于有效地管理能源使用。调度可以基于使用一种或多种资源监测策略收集的数据。在云环境中使用能源发现服务,或者在多核环境中使用控制器,计算任务可以在计算资源(如服务提供商)之间动态切换,选择那些能源效率更高或能源成本更低的资源。例如,一个服务提供商的负载可能比另一个更轻,这样它就可以调整能源使用,也许采用前面提到的一些策略,从而平均每单位工作消耗更少的能源。
降低资源需求
这一类策略将在 第 9 章 中详细介绍。这一类策略包括管理事件到达、限制事件响应、对事件进行优先级排序(也许让低优先级事件得不到处理)、减少计算开销、限制执行时间以及提高资源使用效率,所有这些策略都通过减少工作量来直接提高能源效率。这是与减少使用策略相辅相成的策略,因为减少使用策略假定需求保持不变,而降低资源需求策略是一种明确管理(并减少)需求的手段。
6.3 基于策略的能源效率调查问卷
正如 第 3 章 中所述,这份基于策略的调查问卷旨在快速了解一个架构在运用特定策略来管理能源效率方面的程度。
根据 6.2 节 中描述的策略,我们可以设计出一系列受这些策略启发的问题,具体内容如 表 6.2 所示。为了全面了解为提高能源效率所做出的架构选择,分析师需要提出每个问题,并将答案记录在表格中。随后,这些问题的答案可以作为进一步工作的重点,比如:对文档进行调查、对代码或其他制品进行分析、对代码进行逆向工程等等。
表 6.2 基于策略的能源效率调查问卷
策略组 | 策略问题 | 支持与否(是/否) | 风险 | 设计决策和定位 | 推理和假设 |
---|---|---|---|---|---|
资源监控 | 你的系统是否会对能源使用情况进行计量?也就是说,该系统是否会通过传感器基础设施近乎实时地收集有关计算设备实际能源消耗的数据? | ||||
系统是否会对设备和计算资源进行静态分类?也就是说,在实时计量不可行或计算成本过高的情况下,系统是否有参考值来估算设备或资源的能源消耗? | |||||
系统是否会对设备和计算资源进行动态分类?在由于负载变化或环境条件不同而导致静态分类不准确的情况下,系统是否会根据先前收集的数据,使用动态模型来估算设备或资源在运行时不断变化的能源消耗? | |||||
资源分配 | 系统是否会通过减少使用量来缩减资源使用规模?也就是说,当需求不再需要某些资源时,系统能否停用这些资源,以此来节约能源?这可能包括使硬盘进入休眠状态、调暗显示屏亮度、关闭中央处理器(CPU)或服务器、以较低的时钟频率运行CPU,或者关闭处理器中未使用的内存模块。 | ||||
考虑到任务约束并尊重任务优先级,系统是否会通过将计算资源(如服务提供商)切换为能源效率更高或能源成本更低的资源,来调度资源,从而更有效地利用能源?调度是否基于(使用一种或多种资源监测策略)收集到的有关系统状态的数据? | |||||
系统是否利用发现服务将服务请求与服务提供商进行匹配?在能源效率方面,服务请求可以标注能源需求信息,使请求者能够根据服务提供商(可能是动态的)能源特性来选择服务提供商。 | |||||
降低资源需求 | 你是否始终尝试降低资源需求?在此,你可以插入 第9章 中基于策略的性能调查问卷里,属于这一类别的相关问题。 |
6.4 模式
用于提高能源效率的模式示例包括传感器融合、终止异常任务以及电量监测。
传感器融合
移动应用程序和物联网系统常常会使用多个传感器从其所处环境中收集数据。在这种模式下,来自低功耗传感器的数据可用于推断是否需要从高功耗传感器收集数据。在手机应用场景中一个常见的例子是,利用加速度计数据来判断用户是否移动,若用户已移动,则更新全球定位系统(GPS)的位置信息。该模式假定,就能源消耗而言,访问低功耗传感器的成本要比访问高功耗传感器低得多。
优点:
- 这种模式的显著优点是能够以智能的方式尽量减少对高能耗设备的使用,而不是仅仅简单地降低查询高能耗传感器的频率。
权衡:
- 查询并比较多个传感器会增加前期的复杂性。
- 高能耗传感器能够提供更高质量的数据,不过代价是功耗增加。而且,由于单独使用高能耗传感器所需的时间比先查询辅助传感器再使用高能耗传感器的时间要短,所以它能更快地提供数据。
- 在推断结果频繁导致需要访问高功耗传感器的情况下,这种模式可能会导致整体能耗更高。
终止异常任务
移动系统通常会运行来源不明的应用程序,因此可能会在不知不觉中运行一些极其耗电的应用。这种模式提供了一种方法,用于监测此类应用的能源消耗情况,并中断或终止那些耗电量大的操作。例如,如果某个应用程序正在发出声音警报并使手机震动,而用户没有对这些警报做出回应,那么在预设的超时时间过后,该任务就会被终止。
优点:
- 这种模式为管理能源属性未知的应用程序的能耗提供了一种 “故障安全” 的选择。
权衡:
- 任何监测过程都会给系统操作增加少量的开销,这可能会影响系统性能,并且在一定程度上也会影响能源消耗。
- 需要考虑这种模式的易用性。终止耗电量大的任务可能与用户的意图相悖。
电量监测
电量监测模式用于监测和管理系统设备,尽量减少设备处于活动状态的时间。这种模式试图自动禁用那些未被应用程序积极使用的设备和接口。长期以来,这种模式在集成电路中得到应用,在集成电路中,当电路模块不被使用时,会将其关闭以节省能源。
优点:
- 假设被关闭的设备确实不再需要,那么这种模式可以在几乎不影响终端用户的情况下实现智能节能。
权衡:
- 与让设备持续运行相比,一旦设备被关闭,再次开启设备时,在其能够做出响应之前会有一定的延迟。而且,在某些情况下,设备启动所消耗的能量可能比其在一定时间段内稳定运行所消耗的能量还要多。
- 电量监测器需要了解每个设备及其能源消耗特性,这会增加系统设计前期的复杂性。
6.5 扩展阅读
首批发表的能源策略出自 [Procaccianti 14]。在一定程度上,这些策略为本文所呈现的策略提供了灵感。2014 年的这篇论文随后启发了 [Paradis 21]。本章中介绍的许多策略都得益于这两篇论文。
若想全面且通俗地了解软件开发中的能源使用情况,以及开发者尚未知晓的相关内容,你应当阅读 [Pang 16]。
有几篇研究论文探讨了设计选择对能源消耗的影响,比如 [Kazman 18] 和 [Chowdhury 19]。
在 [Fonseca 19] 中,你可以找到关于开发 “能源感知型” 软件重要性的一般性讨论。
[Cruz 19] 和 [Schaarschmidt 20] 对移动设备的能源模式进行了分类整理。
6.6 问题讨论
- 利用通用场景中每种可能的应对措施,编写一组具体的能源效率场景。
- 为智能手机应用程序(例如健康监测应用)创建一个具体的能源效率场景。
- 为数据中心的一组数据服务器创建一个具体的能源效率场景。这个场景与你为问题 2 创建的场景之间有哪些重要区别?
- 列举出你当前使用的笔记本电脑或智能手机所采用的能源效率技术。
- 在你的智能手机中,使用 Wi-Fi 和蜂窝网络在能源方面有哪些权衡取舍?
- 计算你在平均寿命期间,以二氧化碳形式排放到大气中的温室气体量。这相当于进行了多少次谷歌搜索?
- 假设谷歌每次搜索的能源消耗降低 1%。那么每年能节省多少能源?
- 回答问题 7 时,你消耗了多少能源?