Google Cloud Well-Architected Framework可持续性核心中的这一原则提供了相关建议,可帮助您编写能够最大限度减少能耗和服务器负载的软件。
原则概览
遵循最佳实践来构建云应用时,您可以优化云基础设施资源(AI、计算、存储和网络)所利用的能源。您还可以帮助减少数据中心对用水的需求,以及最终用户设备在访问您的应用时消耗的能源。
如需构建节能型软件,您需要在整个软件生命周期(从设计和开发到部署、维护和归档)中融入可持续性考量。如需详细了解如何使用 AI 构建可最大限度减少云工作负载环境影响的软件,请参阅 Google Cloud 电子书《可持续地构建软件》。
建议
本部分中的建议分为以下重点领域:
- 尽量减少计算工作:倾向于使用精简、专注的代码,以消除冗余逻辑并避免不必要的计算或功能膨胀。
- 使用高效的算法和数据结构:选择时间效率高且内存效率高的算法,以减少 CPU 负载并最大限度地减少内存使用量。
- 优化计算和数据操作:开发时应以高效使用所有可用资源(包括 CPU、内存、磁盘 I/O 和网络)为目标。例如,当您使用事件驱动型逻辑替换繁忙循环时,可以避免不必要的轮询。
- 实现前端优化:为了减少最终用户设备的功耗,请使用最小化、压缩和延迟加载图片和资源等策略。
最大限度地减少计算工作
若要编写节能型软件,您需要尽可能减少应用执行的计算工作总量。每条不必要的指令、冗余的循环和额外的功能都会消耗能量、时间和资源。请按照以下建议构建执行最少计算的软件。
编写精简且重点突出的代码
如需编写实现所需结果所必需的最少代码,请使用以下方法:
- 消除冗余逻辑和功能膨胀:编写仅执行基本功能的代码。避免使用会增加计算开销和复杂性但无法为用户带来可衡量价值的功能。
- 重构:为了随着时间的推移提高能效,请定期审核您的应用,以确定未使用的功能。采取行动来移除或重构此类功能(视情况而定)。
- 避免不必要的操作:在需要结果之前,不要计算值或运行操作。使用延迟评估等技术,在应用中的相关组件需要输出之前延迟计算。
- 优先考虑代码的可读性和可重用性:编写可读且可重用的代码。这种方法可最大限度地减少重复,并遵循“不要重复自己 (DRY)”原则,有助于减少软件开发和维护过程中的碳排放。
使用后端缓存
后端缓存可确保应用不会重复执行相同的工作。较高的缓存命中率可使每个请求的能耗几乎呈线性下降。如需实现后端缓存,请使用以下技术:
- 缓存频繁访问的数据:将频繁访问的数据存储在临时的高性能存储位置。例如,使用内存中缓存服务(如 Memorystore)。当应用从缓存中检索数据时,数据库查询和磁盘 I/O 操作的量会减少。因此,后端数据库和服务器的负载会降低。
- 缓存 API 响应:为避免冗余且代价高昂的网络调用,请缓存频繁 API 请求的结果。
- 优先使用内存中缓存:为了避免缓慢的磁盘 I/O 操作和复杂的数据库查询,请将数据存储在高速内存 (RAM) 中。
- 选择合适的缓存写入策略:
- 透写策略可确保数据同步写入缓存和持久性存储。此策略可提高缓存命中的可能性,因此持久存储会收到较少的耗能型读取请求。
- 回写(后写)策略可提升写入密集型应用的性能。数据先写入缓存,然后异步更新数据库。此策略可减少较慢数据库上的即时写入负载。
- 使用智能逐出政策:保持缓存精简高效。为了移除过时或低效的数据,并最大限度地增加可用于存储频繁请求的数据的空间,请使用存留时间 (TTL)、最近最少使用 (LRU) 和最不常用 (LFU) 等政策。
使用高效的算法和数据结构
您选择的算法和数据结构决定了软件的原始计算复杂度。选择合适的算法和数据结构可最大限度地减少完成任务所需的 CPU 周期数和内存操作次数。更少的 CPU 周期和内存操作意味着更低的能耗。
选择具有最佳时间复杂度的算法
优先考虑在最短时间内实现所需结果的算法。这种方法有助于缩短资源使用时长。如需选择可优化资源使用情况的算法,请使用以下方法:
- 侧重于降低复杂性:如需评估复杂性,请不要只关注运行时指标,还要考虑算法的理论复杂性。例如,与冒泡排序相比,归并排序可显著降低大型数据集的计算负荷和能耗。
- 避免冗余工作:使用所选编程语言或框架中的内置优化函数。这些函数通常使用 C 或 C++ 等更低级、更节能的语言实现,因此与自定义编码的函数相比,它们可以更好地针对底层硬件进行优化。
选择高效的数据结构
您选择的数据结构决定了检索、插入或处理数据的速度。此速度会影响 CPU 和内存用量。如需选择高效的数据结构,请使用以下方法:
- 针对搜索和检索进行优化:对于检查某项是否存在或检索特定值等常见操作,最好使用针对速度进行优化的数据结构。例如,哈希映射或哈希集可实现近乎恒定的时间查找,这比线性搜索数组更节能。
- 尽量减少内存占用空间:高效的数据结构有助于减少应用的总体内存占用空间。减少内存访问和管理可降低能耗。此外,更精简的内存配置可让进程更高效地运行,从而推迟资源升级。
- 使用专用结构:使用专门针对特定问题构建的数据结构。例如,使用 trie 数据结构可快速搜索字符串前缀,而当您需要高效地访问最高值或最低值时,可以使用优先级队列。
优化计算和数据操作
开发软件时,请注重在整个技术堆栈中高效且按比例地使用资源。将 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)。 此类网站和应用的加载速度更快,所需的服务器资源更少。
- 无障碍功能和性能:响应迅速、加载速度快的网站通常更可持续且更易于访问。优化后的简洁设计可减少呈现内容时消耗的资源。经过优化以提升性能和速度的网站有助于提高收入。根据 Deloitte 和 Google 开展的一项研究《Milliseconds Make Millions》(毫秒创造百万美元),网站速度提升 0.1 秒(100 毫秒)可使零售网站的转化率提高 8.4%,平均订单价值提高 9.2%。