一段时间前,我们发布了一篇博客文章,详细介绍了我们如何使用Python以高速导入超过40亿盘棋局,并利用我们的通用性能分析™优化了代码。这基于运行版本8.9的Elastic Stack。我们现在使用8.12版本,现在是时候进行第二部分,展示观察编译语言的简易性以及Elastic®的通用性能分析如何帮助您从成本和环境友好性的角度确定重写的益处。
为什么效率很重要——对您和环境而言
据估计,数据中心消耗了全球约3%的电力,预计到2030年其用电量将翻一番。* 数字服务的成本与其计算效率密切相关,因此,提高效率是一举两得:减少能源消耗,降低账单。
在相同情况下,公司希望能够扩展到更多用户,同时为每个用户花费更少,并正在有效地寻找减少能源消耗的方法。
本着这种精神,通用性能分析配备了数据和可视化工具,可以帮助确定哪些效率改进工作最值得投入。
能源效率衡量的是数字服务在给定输入的情况下产生输出所消耗的能量。它可以通过多种方式进行衡量,我们在Elastic可观测性中选择了CO2排放量和年度化CO2排放量(稍后将详细介绍)。
让我们以一个电子商务网站为例:“搜索库存”过程的能源效率可以计算为为用户请求提供服务所需的平均CPU时间。一旦确定了该值的基线,对提供搜索过程的软件所做的更改可能会导致相同功能消耗的CPU时间或多或少,从而导致代码效率更高或更低。
如何设置和配置瓦特数和CO2
您可以在通用性能分析视图的右上角找到一个“设置”按钮。在那里,您可以自定义用于计算与性能分析数据相关的CO2排放量的系数。
仅当从主机代理收集的概要文件未与云提供商认证的公开已知数据关联时,才会使用此处设置的值。例如,假设您有一个混合云部署,一部分工作负载在本地运行,一部分在GCP中运行。在这种情况下,此处设置的值仅用于计算本地机器的CO2排放量;我们已经使用GCP声明的所有系数来计算这些机器的排放量。
Python与Go
我们的第一篇博文实现了一个使用Python读取PGN棋局(一种文本表示)的解决方案。它展示了如何利用通用性能分析器来识别缓慢的函数,并帮助您更快、更有效地重写代码。最后,我们对Python版本感到满意。它至今仍用于从Lichess数据库获取月度更新并将其导入Elasticsearch®。我一直想找到更多使用Go的机会,于是我们将Python重写为Go。我们利用goroutines和通道通过消息传递发送数据。您可以在我们的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"
现在调试符号已在集群中可用,我们可以同时使用相同的文件运行这两个实现,并查看通用性能分析器可以告诉我们什么。
识别CO2和能源效率节省
Python更频繁地安排在CPU上。因此,它更频繁地在硬件上运行,并更多地占用机器资源。
我们使用差分火焰图来识别并自动计算以下比较中的差异。您需要在基线中过滤process.thread.name:“python3.11”,并在比较中过滤lichess。
观察年度化CO2排放量的影响,我们看到Python解决方案的CO2排放量从65.32公斤下降到16.78公斤。一年节省了48.54公斤CO2。
如果我们退一步,我们将想知道为什么Python会产生更多的排放。在火焰图视图中,我们过滤只显示Python,然后我们可以点击名为python3.11的第一个帧。一个小弹出窗口告诉我们它造成了32.95公斤的排放。这几乎占运行时所有排放量的50%。我们的程序本身造成了另外约32公斤的CO2。通过使用Go取代Python解释器,我们立即减少了32公斤的年度排放量。
我们可以使用右键单击锁定该框,然后单击**显示更多信息**。
**显示更多信息**链接显示有关帧的详细信息,例如样本计数、总CPU、核心秒数和美元成本。我们不会在这篇博客中详细介绍。
使用通用性能分析,立即减少您的碳足迹
这篇博文证明了重写您的代码库可以极大地减少您的碳足迹。使用通用性能分析器,您可以快速进行概念验证,以展示可以节省多少碳资源。
了解您如何开始使用 Elastic 通用性能分析。
- 用于存储数据的集群,其中三个节点(每个节点具有64GB RAM和32个CPU内核)在Elastic Cloud上运行GCP。
- 用于发送数据的机器是GCP e2-standard-32,因此具有128GB RAM和32个CPU内核,以及一个500GB的平衡磁盘用于读取游戏。
- 用于游戏的文件是这个Lichess数据库,包含96,909,211盘游戏。解压后的文件大小为211GB。
来源
*https://media.ccc.de/v/camp2023-57070-energy_consumption_of_data_centers
本文中描述的任何功能或功能的发布和时间安排完全由Elastic自行决定。任何当前不可用的功能或功能可能无法按时或根本无法交付。