不久前,我们发布了一篇博客,详细介绍了我们如何使用 Python 以快速导入超过 40 亿个国际象棋游戏,并通过利用我们的 Universal ProfilingTM 优化代码。这是基于在 8.9 版本上运行的 Elastic Stack。我们现在使用 8.12,现在是时候做第二部分了,展示观察编译语言是多么容易,以及 Elastic® 的通用性能分析如何帮助您确定重写的益处,包括成本和环境友好性角度。
为什么效率很重要——对你和环境都重要
据估计,数据中心消耗全球约 3% 的电力,并且预计到 2030 年其用量将翻一番。* 数字服务的成本与其计算效率密切相关,因此,提高效率是双赢的:减少能源消耗,减少账单。
在相同的场景中,公司希望在减少每个用户支出的同时扩展到更多用户,并且正在有效地寻找减少能源消耗的方法。
本着这种精神,通用性能分析配备了数据和可视化,以帮助确定哪些效率改进工作最值得投入。
能源效率衡量数字服务在给定输入的情况下产生输出所消耗的能量。它可以以多种方式衡量,我们在 Elastic 可观测性选择了 CO2 排放量和年度 CO2 排放量(稍后会详细介绍)。
让我们以一个电子商务网站为例:“搜索库存”流程的能源效率可以计算为服务用户请求所需的平均 CPU 时间。一旦确定了此值的基线,交付搜索流程的软件更改可能会导致相同功能消耗的 CPU 时间增多或减少,从而导致代码效率更高或更低。
如何设置和配置功率和二氧化碳排放量
您可以在通用性能分析视图的右上角找到“设置”按钮。在那里,您可以自定义用于计算与性能分析数据相关的 CO2 排放量的系数。
此处设置的值仅当从主机代理收集的配置文件尚未与云提供商认证的公开已知数据相关联时才会使用。例如,假设您有一个混合云部署,部分工作负载在本地运行,部分在 GCP 中运行。在这种情况下,此处设置的值仅用于计算本地计算机的 CO2 排放量;我们已经使用 GCP 声明的所有系数来计算这些计算机的排放量。
Python vs. Go
我们的第一篇博客文章实现了一个读取 PGN 国际象棋游戏的解决方案,这是一种用 Python 编写的文本表示。它展示了如何利用通用性能分析器来识别慢速函数,并帮助您更快、更高效地重写代码。最后,我们对 Python 版本感到满意。它今天仍然用于从 Lichess 数据库获取每月更新并将其摄取到 Elasticsearch® 中。我一直想找个理由更多地使用 Go,我们把 Python 重写为 Go。我们利用 goroutine 和通道通过消息传递来发送数据。您可以在我们的GitHub 存储库中了解更多信息。
用 Go 重写也意味着从解释型语言切换到编译型语言。与 IT 中的所有事物一样,这既有好处也有坏处。一个缺点是我们必须为编译后的二进制文件提供调试符号。当我们构建二进制文件时,我们可以使用 symbtool 程序来提供调试符号。如果没有调试符号,我们会看到无法解释的信息,因为帧将在火焰图中标记为十六进制地址,而不是源代码注释。
首先,确保您的可执行文件包含调试符号。Go 默认使用调试符号进行构建。您可以使用 file yourbinary 检查这一点。重要的是它没有被剥离。
file lichess
lichess: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=gufIkqA61WnCh8haeW-2/lfn3ne3U_y8MGoFD4AvT/QJEykzbacbYEmEQpXH6U/MqVbk-402n1k3B8yPB6I, with debug_info, not stripped
现在我们需要使用 symbtool 推送符号。您必须创建 Elasticsearch API 密钥作为身份验证方法。在 Kibana® 中的通用性能分析器 UI 中,右上角的“添加数据”按钮会准确地告诉您该怎么做。该命令如下所示。-e 是您传递可执行文件路径的部分。在我们的例子中,这与上面的 lichess 相同。
symbtool push-symbols executable -t "ApiKey" -u "elasticsearch-url" -e "lichess"
现在集群内部可以使用调试符号,我们可以同时使用相同的文件运行这两种实现,看看通用性能分析器可以告诉我们什么。
识别二氧化碳和能源效率节省
Python 更频繁地在 CPU 上调度。因此,它在硬件上运行的频率更高,并且对机器的资源使用贡献更大。
我们使用差异火焰图来识别并自动计算以下比较中的差异。您需要在基线中筛选 process.thread.name: “python3.11”,对于比较,则筛选 lichess。
查看年度 CO2 排放量的影响,我们看到从 Python 解决方案的 65.32kg CO2 减少到 16.78kg。这相当于一年节省了 48.54kg CO2。
如果我们退一步,我们想弄清楚为什么 Python 会产生更多的排放量。在火焰图视图中,我们筛选到只显示 Python,然后我们可以单击第一个名为 python3.11 的帧。一个小弹出窗口告诉我们它导致了 32.95kg 的排放量。这几乎是运行时导致的所有排放量的 50%。我们自己的程序导致了另外约 32kg 的 CO2。我们立即通过使用 Go 剔除 Python 解释器,减少了 32kg 的年度排放量。
我们可以右键单击并点击显示更多信息来锁定该框。
显示更多信息链接会显示有关帧的详细信息,如样本计数、总 CPU、核心秒数和美元成本。我们不会在本博客中深入探讨。
使用通用分析立即减少您的碳足迹
这篇博文证明,重写您的代码库可以大大减少您的碳足迹。使用通用分析器,您可以快速进行 PoC 来展示可以节省多少碳资源。
了解如何立即开始使用 Elastic 通用分析。
- 用于存储数据的集群,其中三个节点在 Elastic Cloud 上运行 GCP,每个节点具有 64GB 内存和 32 个 CPU 核心。
- 用于发送数据的机器是 GCP e2-standard-32,因此具有 128GB 内存和 32 个 CPU 核心,以及 500GB 平衡磁盘用于读取游戏。
- 用于游戏的的文件是这个Lichess 数据库,其中包含 96,909,211 个游戏。解压后的文件大小为 211GB。
来源
*https://media.ccc.de/v/camp2023-57070-energy_consumption_of_data_centers
本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。任何目前不可用的特性或功能可能无法按时交付,或者根本无法交付。