如何测量云环境中虚拟机的功耗?

Posted

技术标签:

【中文标题】如何测量云环境中虚拟机的功耗?【英文标题】:How to measure the power consumption in a virtual machine on a cloud environment? 【发布时间】:2020-04-29 19:00:00 【问题描述】:

我正在云环境(Google Compute Engine)中运行一些与区块链相关的容器。我想测量容器或我正在运行的实例的功率/能耗。

有像powerapi 这样的工具可以在可以访问真实 CPU 计数器的真实基础架构中执行此操作。这应该可以通过基于 CPU、内存和网络使用情况进行估计来实现。 literature 中提出了一种这样的模型。

理论上可以做到吗?如果是这样,是否已经有用于此任务的现有工具。

【问题讨论】:

请记住,这不仅仅是虚拟机的功耗,而是数据中心的电源使用效率。谷歌是该领域的领导者......请参阅:google.com/about/datacenters/efficiency 在比较 VM 的电源使用情况时,还要询问处理所消耗的每瓦功率,环境中绝对消耗了多少功率,以便为您提供瓦特的功率。 【参考方案1】:

一般的答案是“不,不可能”。在虚拟机中运行的程序处理虚拟硬件。虚拟化的目标是从物理硬件中抽象出正在运行的程序,而需要访问物理设备来测量能耗。例如,如果不启用processor affinity,PowerAPI 不太可能由于虚拟 CPU 迁移而能够收集有用的统计信息。允许在一个物理 CPU 上运行多个 vCPU 的时间分片是另一个需要牢记的因素。 RAM、I/O 控制器、存储设备等所消耗的能量不用多说。

一个实质性的答案是“不,不可能”。 manuscript 的作者使用 PowerAPI 库来收集 CPU 统计信息,并使用监视代理来计算通过网络传输的字节数。 PowerAPI 所依赖的 HWPC-sensor 有不同的要求:

"受监控节点运行的 Linux 发行版未托管在 虚拟环境"

此外,作者强调他们无法测量功耗的绝对值,而是使用百分比来比较某些 Java 类和方法,以推测 CPU 密集型工作负载中能量泄漏的根源。

对于网络 I/O,在其模型中用于估计功耗的字节数在暴露于虚拟客户的网络接口和网络上的主机硬件端口之间存在显着差异,而 SDN 堆栈介于两者之间。

【讨论】:

我认为他们使用的 PowerAPI 库是:github.com/abourdon/powerapi-akka 而不是 powerapi.org。当然,这不是一个绝对值,但为什么不能做一个估计呢? powerapi-akka 项目在 GitHub 上的最后一次提交日期为 2016 年,这表明该项目已被弃用。建议考虑原始问题中提到的powerapi.org,并在答案中解释为不适用于虚拟环境。【参考方案2】:

在云实例中进行测量更复杂,是的。如果您确实可以访问底层硬件,那么这是可能的。最近有一个项目允许获取 qemu/kvm 管理程序的功耗指标,并通过 VM 中的另一个代理共享与每个虚拟机相关的指标:github.com/hubblo-org/scaphandre/

如果虚拟机管理程序和虚拟机之间无法进行此类通信,例如在公共云实例上工作时,他们还在(很早就)在"degraded mode" 上工作以估计*实例/虚拟机的功耗。

*:基于VM中的资源(cpu/ram/gpu...)消耗和实例的特性以及底层硬件功耗“profile”。

【讨论】:

【参考方案3】:

我们能否得出结论,不可能测量在虚拟机上运行的进程的功耗/能耗?

【讨论】:

我希望我们可以得出结论,对于基于云的 VM。但是,如果您想测量由您自己管理的虚拟机管理程序的功率,VMWare Vshpere 等工具可以让您测量功耗。

以上是关于如何测量云环境中虚拟机的功耗?的主要内容,如果未能解决你的问题,请参考以下文章

通过python获取kvm虚拟机的监控信息(基于libvirt API)

sr-iov在私有云环境中的应用与实践

传统环境虚拟化/云环境中分别如何部署网络镜像

Docker的安装 与 环境配置 及 阿里云镜像仓库配置常用命令等

linux云自动化运维基础知识15(虚拟机的基本操作)

传统环境虚拟化/云环境中分别怎么部署网络镜像