Google Cloud Well-Architected Framework 可持续性核心中的这一原则提供了相关建议,可帮助您编写能最大限度减少能源消耗和服务器负载的软件。
原则概览
遵循最佳实践构建云应用时,您可以优化云基础设施资源(AI、计算、存储和网络)所利用的能源。您还可以帮助减少数据中心的水需求,以及最终用户设备在访问您的应用时消耗的能源。
如需构建高效利用能源的软件,您需要在整个软件生命周期(从设计和开发到部署、维护和归档)中融入可持续发展考量。如需详细了解如何使用 AI 构建可最大限度减少云工作负载对环境影响的软件,请参阅 Google Cloud 电子书《Build Software Sustainably》(可持续地构建软件)。
建议
本部分中的建议分为以下重点领域:
- 尽量减少计算工作:优先使用精简、专注的代码,消除冗余逻辑,避免不必要的计算或功能膨胀。
- 使用高效的算法和数据结构:选择时间效率和内存效率高的算法,以减少 CPU 负载并最大限度地降低内存用量。
- 优化计算和数据操作:在开发时,应以高效使用所有可用资源(包括 CPU、内存、磁盘 I/O 和网络)为目标。例如,当您将忙碌循环替换为事件驱动型逻辑时,可以避免不必要的轮询。
- 实施前端优化:为了减少最终用户设备消耗的电量,请对图片和资源使用缩减、压缩和延迟加载等策略。
最大限度地减少计算工作
如需编写节能软件,您需要最大限度地减少应用执行的计算工作总量。每条不必要的指令、冗余循环和额外功能都会消耗能源、时间和资源。请遵循以下建议,构建执行最少计算的软件。
编写精简、专注的代码
如需编写实现所需结果所必需的最少代码,请使用以下方法:
- 消除冗余逻辑和功能膨胀:编写仅执行基本功能的代码。避免使用会增加计算开销和复杂性,但不会为用户提供可衡量价值的功能。
- 重构:为了长期提高能效,请定期审核您的应用,以找出未使用的功能。采取措施酌情移除或重构此类功能。
- 避免不必要的操作:在需要结果之前,请勿计算值或运行操作。使用延迟求值等技术,将计算延迟到应用中的依赖组件需要输出时。
- 优先考虑代码的可读性和可重用性:编写可读且可重用的代码。这种方法可最大限度地减少重复,并遵循不要重复 (DRY) 原则,这有助于减少软件开发和维护产生的碳排放。
使用后端缓存
后端缓存可确保应用不会重复执行相同的工作。缓存命中率越高,每个请求的能耗几乎呈线性下降。如需实现后端缓存,请使用以下方法:
- 缓存频繁访问的数据:将经常访问的数据存储在临时的高性能存储位置。例如,使用 Memorystore 等内存中缓存服务。当应用从缓存中检索数据时,数据库查询和磁盘 I/O 操作的数量会减少。因此,后端数据库和服务器的负载会降低。
- 缓存 API 响应:为避免冗余且成本高昂的网络调用,请缓存频繁 API 请求的结果。
- 优先考虑内存缓存:为了消除缓慢的磁盘 I/O 操作和复杂的数据库查询,请将数据存储在高速内存 (RAM) 中。
- 选择合适的缓存写入策略:
- 透写策略可确保数据同步写入缓存和永久性存储区。此策略可提高缓存命中率,从而减少持久性存储区收到的耗能读取请求。
- 回写(延迟写入)策略可提升写入密集型应用的性能。数据会先写入缓存,稍后数据库会异步更新。此策略可减少较慢数据库的即时写入负载。
- 使用智能逐出政策:保持缓存精简高效。如需移除过时或低效数据,并最大限度地增加可用于频繁请求的数据的空间,请使用存留时间 (TTL)、最近最少使用 (LRU) 和最不经常使用 (LFU) 等政策。
使用高效的算法和数据结构
您选择的算法和数据结构决定了软件的原始计算复杂度。选择适当的算法和数据结构后,您就可以最大限度地减少完成任务所需的 CPU 周期数和内存操作数。CPU 周期和内存操作减少,能耗也随之降低。
选择可实现最佳时间复杂度的算法
优先选择能在最短时间内达到所需结果的算法。这种方法有助于缩短资源使用时长。如需选择可优化资源使用情况的算法,请使用以下方法:
- 专注于降低复杂性:如需评估复杂性,请超越运行时指标,考虑算法的理论复杂性。例如,与冒泡排序相比,归并排序可显著减少大型数据集的计算负载和能源消耗。
- 避免重复工作:在所选编程语言或框架中使用内置的优化函数。这些函数通常使用 C 或 C++ 等更底层、更节能的语言实现,因此与自定义编码函数相比,它们针对底层硬件进行了更好的优化。
选择高效的数据结构
您选择的数据结构决定了数据的检索、插入或处理速度。此速度会影响 CPU 和内存用量。如需选择高效的数据结构,请使用以下方法:
- 针对搜索和检索进行优化:对于检查项是否存在或检索特定值等常见操作,请首选针对速度进行了优化的数据结构。例如,哈希映射或哈希集可实现近乎恒定的时间查找,这是一种比通过数组进行线性搜索更节能的方法。
- 最大限度地减少内存占用:高效的数据结构有助于减少应用的总体内存占用。减少内存访问和管理可降低功耗。此外,更精简的内存配置文件可让进程更高效地运行,从而让您推迟资源升级。
- 使用专用结构:使用专为特定问题构建的数据结构。例如,使用字典树数据结构进行快速字符串前缀搜索,并在只需要高效访问最高值或最低值时使用优先级队列。
优化计算和数据操作
开发软件时,请专注于在整个技术栈中高效且按比例使用资源。将 CPU、内存、磁盘和网络视为有限的共享资源。认识到高效利用资源可以切实降低成本和能源消耗。
优化 CPU 利用率和空闲时间
为了最大限度地减少 CPU 在不执行有意义的工作的情况下处于活跃、耗能状态的时间,请使用以下方法:
- 优先使用事件驱动型逻辑,而不是轮询:将资源密集型忙碌循环或持续检查(轮询)替换为事件驱动型逻辑。事件驱动型架构可确保应用的组件仅在由相关事件触发时才运行。这种方法支持按需处理,从而无需进行资源密集型轮询。
- 防止持续高频运行:编写不会强制 CPU 持续以最高频率运行的代码。为了最大限度地降低能耗,处于空闲状态的系统应能够进入低功耗状态或睡眠模式。
- 使用异步处理:为防止线程在空闲等待期间被锁定,请使用异步处理。这种方法可以释放资源,并提高整体资源利用率。
高效管理内存和磁盘 I/O
内存和磁盘使用效率低下会导致不必要的处理和功耗增加。如需高效管理内存和 I/O,请使用以下方法:
- 严格的内存管理:采取行动主动释放未使用的内存资源。避免在内存中保留大型对象的时间超过必要时间。这种方法可以防止性能瓶颈,并减少内存访问所消耗的电量。
- 优化磁盘 I/O:减少应用与永久性存储资源的读写交互频率。例如,使用中间内存缓冲区来存储数据。以固定间隔或在缓冲区达到特定大小时将数据写入永久性存储。
- 批量操作:将频繁的小型磁盘操作整合为更少、更大的批量操作。与许多单独的小型事务相比,批处理操作消耗的能量更少。
- 使用压缩:通过应用合适的数据压缩技术,减少写入磁盘或从磁盘读取的数据量。例如,如需压缩存储在 Cloud Storage 中的数据,您可以使用解压缩转码。
最大限度地减少网络流量
网络资源在数据传输操作期间会消耗大量能源。 如需优化网络通信,请使用以下方法:
- 尽可能减小载荷大小:设计 API 和应用,使其仅传输请求所需的数据。如果只需要几个字段,请避免提取或返回大型 JSON 或 XML 结构。确保返回的数据结构简洁。
- 减少往返次数:如需减少完成用户操作所需的网络往返次数,请使用更智能的协议。例如,优先选择 HTTP/3 而非 HTTP/1.1,选择 GraphQL 而非 REST,使用二进制协议,以及整合 API 调用。当您减少网络调用量时,服务器和最终用户设备的能耗都会降低。
实施前端优化
前端优化可最大限度地减少最终用户必须下载和处理的数据,这有助于减少最终用户设备资源的负载。
精简代码和资源
当最终用户需要下载和处理更小、结构更高效的资源时,其设备消耗的电量会更少。为了最大限度地减少最终用户设备上的下载量和处理负载,请使用以下方法:
- 精简和压缩:对于 JavaScript、CSS 和 HTML 文件,请使用适当的精简工具移除不必要的字符(例如空格和注释)。确保图片等文件经过压缩和优化。您可以使用 CI/CD 流水线自动执行 Web 资源的最小化和压缩。
- 延迟加载:仅在实际需要时(例如,当这些元素滚动到网页的视口中时)加载图片、视频和非关键素材资源。这种方法可减少初始数据传输量和最终用户设备上的处理负载。
- 更小的 JavaScript 软件包:使用现代模块打包器和摇树优化等技术,从 JavaScript 软件包中移除未使用的代码。这种方法可以生成更小的文件,从而加快加载速度并减少服务器资源的使用。
- 浏览器缓存:使用 HTTP 缓存标头指示用户的浏览器在本地存储静态资源。浏览器缓存有助于防止在后续访问中重复下载和产生不必要的网络流量。
优先考虑轻量级用户体验 (UX)
界面的设计可能会对渲染前端内容的计算复杂性产生重大影响。如需构建提供轻量级用户体验的前端界面,请使用以下技术:
- 高效渲染:避免频繁进行资源密集型文档对象模型 (DOM) 操作。编写可最大限度降低渲染复杂性并消除不必要的重新渲染的代码。
- 轻量级设计模式:在适当的情况下,首选静态网站或渐进式 Web 应用 (PWA)。此类网站和应用加载速度更快,所需的服务器资源更少。
- 无障碍性和性能:响应迅速、加载速度快的网站通常更具可持续性,也更易于访问。经过优化、简洁明了的设计可减少内容呈现时消耗的资源。经过性能和速度优化的网站有助于提高收入。根据德勤和 Google 的一项研究《Milliseconds Make Millions》(毫秒必争,收益百万),网站速度提升 0.1 秒(100 毫秒),零售网站的转化次数就会增加 8.4%,平均订单价值也会增加 9.2%。