OCaml.org 集群环境影响更新
简而言之,对于我们在 OCaml.org 集群中监控的 19 台机器,我们观察到每周约 70 公斤二氧化碳当量的排放量。 此处为讨论主题。
自从 OCaml.org 网站改版以来,我们社区已承诺对我们对环境的影响负责。作为第一步,我们旨在通过计算我们使用的总能量来准确量化我们的影响。有必要建立当前活动的基线,以确定我们未来做出的任何改变是否会减少我们的二氧化碳当量排放。
确定这个数字并非易事,因为有一个大型机器集群昼夜不停地运行,提供诸如ocaml-ci、opam-repo-ci、Docker 基础镜像以及 ocaml.org 本身和联合 watch.ocaml.org 等服务。这些机器跨越众多架构、操作系统和类型(例如虚拟机与裸机),这使得构建可移植的工具来监控每台机器变得困难。
在过去的几个月里,我们构建了新的工具并部署了监控设备,以便尽可能准确地获得数据。
使用支持 IPMI 的机器进行监控
收集功耗数据的一种方法是使用智能平台管理接口 (IPMI)。IPMI 是一套接口的规范,允许管理和监控计算机。IPMI 使用的控制器通常是基板管理控制器 (BMC)。监控服务器的传感器(包括功耗、温度和风扇速度)通常会向 BMC 报告数据。
Clarke 是我们构建的一个工具,它为不同的监控和报告功耗方法提供了通用接口。它可以使用ipmitool收集功耗数据,并将其报告给Prometheus。
我们在一些支持 IPMI 的机器上安装了Clarke,并对OCluster进行了修改,以便获取每台机器生成的 Prometheus 输出。
量化电力的碳强度
许多需要电力运行的系统都由国家电网供电。电网的电力通常由各种发电活动产生,不同活动的组合通常被称为电网的能源结构。
根据这种结构,可以计算平均碳强度。碳强度是指为了供应一千瓦时的电力而产生的二氧化碳当量 (CO2e) 排放量。单位为每千瓦时克二氧化碳当量 (gCO2e/kWh)。为什么是 CO2e?二氧化碳 (CO2) 不是唯一的温室气体(例如,还有水蒸气、甲烷等)。二氧化碳当量单位为我们提供了一种在各种温室气体之间进行转换的方法,从而提供了一种公平的方式来比较不同的排放活动。
幸运的是,我们可以使用 IMPI 监控的机器都位于剑桥。我们可以使用carbon-intensity API 访问英国国家电网的实时数据。事实上,我们开发了一个同名的工具,carbon-intensity,用于抽象各种 API,为获取碳强度值提供单个通用接口。
type t
(** A configuration parameter for the API *)
val get_intensity : t -> int option
(** [get_intensity t] returns the current gCO2/kWh if available. *)
总排放量的数值
有了集群的总耗电量和碳强度的数值,我们现在可以计算能源使用的总排放量。对于一台机器,假设功耗读数为250W
。我们还知道我们采样功耗读数的频率,例如每10s
一次。我们可以使用这些值来计算kWh
值。
(250 / 1000) * (10 / 3600) = 0.000694
如果电网当前报告的碳强度为100gC02e/kWh
,则此时此刻的排放量为
0.000694 * 100 = 0.0694gCO2
从这个角度来看,对于一个人来说,从伦敦希思罗机场到贝尔法斯特国际机场(约 500 公里)的单程旅行大约会产生160kg
的二氧化碳当量。如果上述虚拟机器始终消耗250W
,并且电网始终具有相同的强度,则大约需要 266 天才能达到相同的排放量。
我们可以对每台机器每十秒进行此计算,并将它们加在一起,以得出这些机器在任意一段时间(例如一周)内的总排放量。
目前,对于我们监控的 19 台机器,我们观察到每周约70kg
二氧化碳当量的排放量。这会根据集群的当前负载和电网的碳强度而波动。在撰写本文时,电网今天碳强度的最大值为125gCO2e/kWh
,最小值为55gCO2e/kWh
。
后续步骤
公开可用的仪表盘
排放量背后的数据目前尚不公开。我们希望提供一个简单的仪表盘,让感兴趣的人能够查看实时数据。
不支持 IPMI 的机器
并非所有机器都支持 IPMI。一种可能的解决方案是直接从硬件获取电源信息。Variorum 是一个“供应商中立的库,用于公开电源和性能功能”。使用 Variorum,我们可以访问诸如英特尔的 RAPL接口等信息。我们已经完成了此库的 OCaml 绑定,这些绑定已集成到Clarke 中。虽然 Variorum 报告的功耗值可能不完美或不完整,但它们将是一个很好的代理,可以使更多类型的机器能够被监控。
其他排放
体现的能源和碳也构成了我们对环境影响的很大一部分。体现的碳反映了创建和最终处置运行我们软件的机器所需的碳污染量。这些数字不一定最容易计算,但我们可以开始尝试计算我们使用的硬件的体现碳的某些数据,以及新硬件以何种速度替换缓慢或损坏的硬件(以及旧硬件的去向)。
通过结合这些数据,我们将对我们的碳足迹有更现实的了解,从而更有可能长期减少我们的影响。
碳意识解决方案
既然我们已经对我们的环境影响有了一些了解,现在是时候开始考虑如何将其最小化了。例如
- 对低优先级作业进行碳意识调度。carbon-intensity API 支持对电网的碳强度进行相当准确的预测,利用这一点,我们可以安排 Docker 基础镜像构建仅在碳强度低时进行。
- 通过更好的求解器减少构建次数。目前许多包在构建过程中会一次性安装其依赖项。这意味着求解器服务会计算出所需的精确包和依赖项,并在单个构建步骤中安装它们。这也意味着,如果一个下游包发生更改,则整个构建步骤将失效,导致完全重新构建。我们可以将安装过程分成多个步骤来帮助缓解这个问题——特别是对于像 dune 这样的大型、更稳定的包。
结论
OCaml.org 背后的社区一直在努力履行我们对可持续发展的承诺。我们的首要目标是建立一种方法来衡量 OCaml.org 集群在特定时间段内消耗了多少二氧化碳当量。在过去的几个月里,我们一直在开发一种方法,使我们能够很好地估算出这个数字。
要获得更准确的结果,还有工作要做,例如考虑嵌入式能源和碳,以及能够测量更多类型机器的能耗。我们的目标是创建碳意识解决方案,最大限度地减少 OCaml.org 集群对环境的影响。