 | 级别: 中级 James Smith, 开发经理, AMEE
2009 年 11 月 12 日 随着 IT 使用的增加,Information
and Communication Technology (ICT) 系统所排放的 CO2 释放量非常可观。ICT 提供者正在努力寻找各种方式来减少这种释放量,比如通过提高效率、进行云计算等,但是监视这些系统仍然是一个最基本的要求。Avoiding Mass
Extinctions Engine (AMEE) 平台提供了一种标准的框架来追踪碳排放量,并且还实现了各种计算方法。在本文中,我们将研究使用 AMEE 平台计算 ICT 排放量的一些可能方式,而且还将讨论能够实现对这些系统进行自动监测的一些 Ruby 脚本。
简介
AMEE 是一个基于 Web 的 API,允许用户存储和检索很多格式的长时间的消费数据,并且还能同步一些较成熟的碳计算模型来判断这种消费的环境后果。它已经被开发人员使用来提供大量能量跟踪和能量管理解决方案。
AMEE API 包含两个部分:配置文件和数据。能量数据一般存储在一组配置文件内。通过保存这些数据,您就可以为您的客户、您的生意或您自己构建能量使用历史。数据区域则保存了大量标准模型,包括 GHG
Protocol、SAP 构建评估、150 个国家和地区的碳排放量系数以及相关的方法。当您将消费数据存储在一个配置文件内时,这些模型会自动应用以便给出针对您的能量使用的可靠碳排放量。
作为一种中性的聚合平台,AMEE 使大量的碳计算方法成为可能,这些计算方法使用不同的计算技术、不同的输入以及不同程度的准确性。具体使用哪种计算方法取决于您自己,并且应该是您在使用此平台之前必须要做的决定之一。这个决定取决于您的报告要求、法律要求等。在本文中,我们将以对 ICT 释放量的监视为例来强调测量技术以及不同的测量技术所能带来的不同结果。
在 Ruby 内使用 AMEE
在本文中,我们将用 Ruby 编写脚本。因此,我们将能够使用这个 AMEE Ruby gem 来加速开发(查看
参考资料)。这个库是由 AMEE 开发的,并且抽出了很多验证、HTTP 以及 XML 解析的细节。要了解就 API 访问而言背后的内幕,可阅读 “Introduction to AMEE”(参见 参考资料)。我们假设本文中的脚本所用的是一个类似于 UNIX® 的环境,但是这里的很多技术经少许修改就可适用于 Windows® 平台。这里所开发的所有脚本都可从
AMEE 源控系统下载(参见
参考资料)。
要安装这个 Ruby gem,需要 Ruby V1.8.6 和 RubyGems
V1.3.0 或二者的更高版本。在您的机器上,运行如下命令,如清单 1 所示。
清单 1. 安装 Ruby gem
sudo gem sources -a http://gems.github.com
sudo gem install Floppy-amee
|
使用平均数
估计计算机系统的释放量的一种方式是使用由 DEFRA 在英国发布的一组已标准化的数字,这组数字在 AMEE
的 /home/appliances/computers 类别中给出。这种方法使用了简化了的平均数来得到不同类型的计算机设备的释放量的值。比如,针对桌面 PC 的释放量值,针对 LCD 屏的释放量值,等等。这种方法还包括了各种设备处于待机状态时的用电量的估计值。
要从 AMEE 获得碳释放量,我们需要为我们想要测量的每个设备创建相应的配置文件项。清单 2
在一个已有的配置文件中创建了一个代表桌面 PC 的配置文件项。
清单 2. 在一个已有的配置文件中创建了一个代表桌面 PC 的配置文件项
#!/usr/bin/env ruby
require 'rubygems'
gem 'Floppy-amee'
require 'amee'
AMEE_SERVER = "stage.amee.com"
AMEE_USERNAME = "your_username"
AMEE_PASSWORD = "your_password"
AMEE_PROFILE = "E9561EE2B7D9" # Change for your profile UID
AMEE_CATEGORY = "/home/appliances/computers/generic"
AMEE_DRILL = "device=Personal%20Computers&rating=Desktop"
# Connect
amee = AMEE::Connection.new(AMEE_SERVER, AMEE_USERNAME, AMEE_PASSWORD)
# Get data item UID for desktop PC
uid = AMEE::Data::DrillDown.get(amee, "/data#{AMEE_CATEGORY}/drill?#{AMEE_DRILL}")
.data_item_uid
# Store item
category = AMEE::Profile::Category.get(amee, "/profiles/#{AMEE_PROFILE}
#{AMEE_CATEGORY}")
item = AMEE::Profile::Item.create(category, uid)
# Print result
puts item.total_amount
|
在连接到 AMEE 后,我们执行一个向下钻取的查询来获得针对我们想要存储的信息的正确的数据项。之后,我们使用这个由向下钻取获得的数据项 UID 在恰当的类别内创建一个配置文件项。结果在此项目响应内返回,我们打印出此结果作为参考。这个桌面 PC 每年排放 230kg 的 CO2。
很明显,这个数字十分粗略。我们通过对开机状态的计算机进行更精确的跟踪可以对此加以改进。为此,我们需要 在创建配置文件项时设置开始和结束日期参数。此脚本的下一个版本会为脚本运行的那天创建一项。如果这个脚本每天运行一次,那么 AMME 只跟踪计算机运行的那些天。
清单 3. 只在计算机运行的那些天跟踪计算机
# Store item
category = AMEE::Profile::Category.get(amee, "/profiles/#{AMEE_PROFILE}#{AMEE_CATEGORY}")
options = {
:start_date => Date.today,
:end_date => Date.today + 1.day
}
item = AMEE::Profile::Item.create(category, uid, options)
|
我们还可以向此脚本添加跟踪附加设备(比如 LCD 屏)的功能,而且通过添加一个名称参数(在本例中,设为此 PC 的主机名),我们可以在同一个配置文件中存储多个计算机,以便这个配置文件可被用来代表整个办公室。我们之后可以在多个机器上设置这个脚本,并让所有这些脚本将其数据提交给同一个配置文件。
清单 4. 跟踪附加设备
hostname = 'hostname'
def store_item(connection, category, drill, name)
# Get data item UID
uid = AMEE::Data::DrillDown.get(connection, "/data#{AMEE_CATEGORY}/drill?
#{drill}").data_item_uid
# Store item
options = {
:start_date => Date.today,
:end_date => Date.today + 1.day,
:name => name
}
AMEE::Profile::Item.create(category, uid, options)
end
store_item(amee, category, "device=Personal%20Computers&rating=Desktop", hostname)
store_item(amee, category, "device=Monitor&rating=LCD", hostname)
|
这些排放数字到底意味着什么呢?答案就在 AMEE 数据文档中(参见 参考资料)。这个站点对 AMEE 中所有的数据都做了详尽的解释。在本示例中,这些针对计算机的数字被解释为是基于一种每天 5 1/2 小时的典型使用模式。对于您的应用程序来说,这些结果可能不够精确,因此我们还要找到另一种方法来获取更加精确的结果。
估计电量的使用
为了能得到一个更精确评估,我们假设您电脑系统的平均电量使用量是已知的(单位是瓦特)。这个数值是很容易得到的,例如,我们用一个能量监控器插件就可以得到这个数据。那么,我们如何在 AMEE 中使用这个更精确的数字来计算排放量呢?
由于我们使用的是实际的电量数,因此我们不再需要使用计算机类别,而是需要处理电能消耗的确切数量。为了实现这个目的,我们将使用 /home/energy/quantity 类别中的电能项。另外我们还需要知道这个 PC 到底工作了多长时间,我们需要每小时保存一次数据(您还可以根据需要选择缩短保存数据的间隔时间)。如果我们设定这个脚本每小时运行一次,我们将能获得一个相当精确的排放量评估值。
清单 5. 处理电能消耗的确切数量
#!/usr/bin/env ruby
require 'rubygems'
require 'amee'
require 'activesupport'
AMEE_SERVER = "stage.amee.com"
AMEE_USERNAME = "your_username"
AMEE_PASSWORD = "your_password"
AMEE_PROFILE = "E9561EE2B7D9" # Change for your profile UID
AMEE_CATEGORY = "/home/energy/quantity"
AMEE_DRILL = "type=electricity"
POWER_IN_KILOWATTS = 0.2
HOSTNAME = `hostname`
# Connect
amee = AMEE::Connection.new(AMEE_SERVER, AMEE_USERNAME, AMEE_PASSWORD)
category = AMEE::Profile::Category.get(amee, "/profiles/#{AMEE_PROFILE}
#{AMEE_CATEGORY}")
# Get data item UID
uid = AMEE::Data::DrillDown.get(amee, "/data#{AMEE_CATEGORY}/drill?
#{AMEE_DRILL}").data_item_uid
# Store item
time = Time.now
options = {
:energyConsumption => POWER_IN_KILOWATTS,
:energyConsumptionUnit => "kWh",
:energyConsumptionPerUnit => "h",
:start_date => time,
:end_date => time + 1.hour,
:name => HOSTNAME
}
item = AMEE::Profile::Item.create(category, uid, options)
# Print result
puts "#{item.total_amount} #{item.total_amount_unit}"
|
因为我们需要告诉 AMEE 每个周期使用的能量值,所以我们还需要一些其他的参数。在本示例中,我们使用的是一个固定值 200W(举例),我们将 energyConsumption 配置文件项的值设置为 0.2。由于这是能量消耗的值而非电量值(我们的电量值是 200W),所以我们需要指定这个值的单位以确保它的正确性。在本示例中,我们将单位设为千瓦时/小时,这样我们就可以输入我们电量值了。
设置您的国家
默认状态下,清单 5 中的计算将使用英国电能排放系数。但您可以通过设置 /metadata 类别中的国家值来改变整个配置文件的这个行为。通过设置国家名称或国家的 ISO 代码,系统在计算时会自动地选择恰当的电能系数。清单 6 设置这个参数。
清单 6. 设置国家的 ISO 代码
uid = AMEE::Data::DrillDown.get(amee, "/data/metadata/drill").data_item_uid
AMEE::Profile::Item.create_without_category(amee, "/profiles/#{AMEE_PROFILE}
/metadata", uid, :country => "US")
|
实时监控
上述的方法已经可以为您提供一个足够精确的评估值了。但在某些情况下,我们还需要更加精确的值。例如,我们可能需要计算出每一分钟的电量值。对于虚拟系统或基于云的系统,这尤为重要,因为虚拟系统或基于云的系统排放量与负荷更为相关。
可惜,我们并没有一个标准方法来测量 OS 内核中的电量,因此我们能做的还只能是估算。但如果能找到一种能将不同的操作参数转化为电量使用值的模型,我们就可以做些有意义的计算了。
CPU 使用电量的评估
评估电量使用的最显而易见的方法就是将 CPU 负荷作为一个指示器。我们可以每一分钟对 CPU 使用做一次测量,然后用一个定义好的数学模型将每次的测量结果转化为一个电量使用值,并将这个结果提交给 AMEE 以获得一个更精确的排放量评估值。
首先,我们先解决 CPU 使用量的问题。这里我们假设使用的是 UNIX 一类的系统,我们可以通过一些系统调用来获取我们需要的信息。首先,我们需要知道一个系统中 CPU 的个数,这只需用几个简单 UNIX 命令就可以得到。
清单 7. 确认系统中 CPU 的个数
# Get number of processors
num_procs = 'cat /proc/cpuinfo | grep processor | wc -l'.to_i
|
接下来,我们需要获取全部运行的过程的总的 CPU 使用值,然后除以 CPU 的个数。这样我们就得到了单个 CPU 的使用值。
清单 8. 获取总的 CPU 使用值
# Get CPU usage
processes = 'ps -e -o pcpu,cmd | grep -v cpu.rb'
cpu_total = 0
processes.each do |proc|
cpu_total += proc.to_f
end
cpu_total /= (num_procs*100.0)
|
下一步是应用与电量相关的这个模型。我们假设 CPU 与电量使用之间呈线性关系。如果我们可以测量出 CPU 在 0 使用率时(或尽可能接近 0)与在 100% 使用率时的电量,我们就可以假设二者之间是线性关系。所以,50% 使用率时的 CPU 的电量值就是 Pmin + (0.5 * (Pmax - Pmin))。下面显示的就是这个线性模型的代码。
清单 9. 线性模型
# Calculate power
min_power = 0.15
max_power = 0.25
power = min_power + (cpu_total * (max_power - min_power))
|
得到的电量使用值被提交给 AMEE。
清单 10. 将得到的电量使用值提交给 AMEE
# Store item
time = Time.now
options = {
:energyConsumption => power,
:energyConsumptionUnit => "kWh",
:energyConsumptionPerUnit => "h",
:start_date => time,
:end_date => time + 1.minute,
:name => HOSTNAME
}
item = AMEE::Profile::Item.create(category, uid, options)
|
显然,这是一个很简单的模型,它只使用了一个参数,并假设了一个线性关系。而更复杂的模型应该考虑到其他因素,比如过程的磁盘使用量,而这些过程往往是大量使用磁盘而不是 CPU。
实时碳计算
最近,Realtimecarbon.org 在英国发布,它使用 AMEE 来计算英国电力系统的实时碳浓度(见 参考资料)。由于发电的方法随着需求的变化而不断改变,因此每 kWh 的 CO2 的排放量也随之不断改变。这可能就需要引入云计算,因而虚拟主机实例也在全球范围内不断变化以利用最低碳量和非峰值需求。这被称为 “追逐月亮”,因为至少是在英国,最低的碳量是在晚上。
使用实时数据就像是使用一个不同的类别来保存您的电量数据那么简单。如果您使用的是 /home/energy/electricity/realTimeElectricity 类别中的 GB 数据项而非 /home/energy/quantity,那么您将得到一个基于瞬时碳浓度的碳值。在这个类别中创建项的代码与上面出现过的代码基本相同,只有少许区别。
清单 11. 获取一个基于瞬时碳浓度的碳值
AMEE_CATEGORY = "/home/energy/electricity/realTimeElectricity"
AMEE_DRILL = "country=GB"
...
# Store item
time = Time.now
options = {
:energyUsed => power,
:energyUsedUnit => "kWh",
:energyUsedPerUnit => "h",
:start_date => time,
:end_date => time + 1.minute,
:name => HOSTNAME
}
item = AMEE::Profile::Item.create(category, uid, options)
|
排放量的图表表示
存储数据非常有用,但我们往往想要获得一些反馈信息。除标准 XML 和 JSON API 以外,AMEE 中的配置文件类别都可被视为 Atom 提要,这对于我们所创建的时间序列数据而言非常理想。这里的 URL 的格式为:http://username:password@stage.amee.com/profiles/{profile_uid}/home/energy/quantity.atom 。
这些提要包括类别中的每个配置文件项并按日期排序,它还包括一些特殊的标签,内含每一项的碳排放量。通过使用 Google Chart 这类的工具,我们很容易就可以提取数据并生成所存储数据的简单直观的数据表示。
结束语
在本文中,我们探讨了几种在 AMEE 中保存数据的方法。我们还特别创建了一系列通过 AMEE 平台对计算机系统进行自动跟踪和监控的脚本。所有这些脚本的代码都可以在 AMEE 源控系统中找到。
选择计算方法是使用 AMEE 平台的重要环节。通常,您的特定应用程序或客户机将决定您应选用哪一种计算方法,但 AMEE 在 AMEE 数据文档站点上为特定场景提供了一系列现成推荐方法。若想讨论您的具体需求,您可以发送邮件到 help@amee.com。
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | James Smith 是 AMEE 的开发经理。他具有软件工程方面的背景,在 C++ 软件开发领域具有十多年的经验,所从事的项目范围很广,从生物指标到飞行仿真,还具有 3-D 动画算法的博士学位。他在环境软件领域做过大量工作,在加入 AMEE 之前,他从事过很多基于 Web 的项目,比如 Carbon Diet 和 Green Thing。 |
对本文的评价
|  |