节电调度插件#
AIP节电策略根据AIP集群中的主机的作业管理开启和关闭主机电源,以达到数据中心节电的功效。 AIP支持自动在主机闲置一段时间后关机,节省能源,并根据作业需要打开主机的电源, 随着工作负载的变化采取相应的电源管理操作。
缺省的调度策略针对集群中所有主机采用同样的策略。在异构集群中,往往需要根据不同主机的应用场景 使用不同的节电策略。使用外插的节电调度程序可以解决这类问题。
使用外插节电调度程序,在 cb.yaml 中配置:
调度器调用节电策略的时间间隔
开机命令
关机命令
AIP支持节电策略插件:自定义脚本power_ext_sched
AIP根据cb.yaml配置的节电策略周期间隔,定期调用power_ext_sched, 并输入当前集群各队列主机和作业状态,power_ext_sched评估当前集群状态,决定是否执行开关机动作。 power_ext_sched调用AIP命令执行开关机动作。
AIP记录由节电策略触发的开关机,配置机器空闲功率后,可以统计总节电量:
总节电 = 机器空闲功耗 * 关机时间 * 机器数量
启动节电策略#
修改配置文件/opt/skyformai/etc/cb.yaml,添加以下参数:
power_sched_interval
电源节能调度器调用的时间间隔,单位为秒。默认情况下,它会调用内置的节能调度器。如果存在可执行文件 /opt/skyformai/sbin/power_ext_sched,则会在此时间间隔内调用它以替代内置的节能调度器。
当调用 power_ext_sched 时,cbsched 会将数据以 JSON 格式通过管道传递给 power_ext_sched 程序,即 power_ext_sched 应该从其标准输入中读取 JSON 数据,以便外部调度器做出决策并采取行动。
该 JSON 的示例输出为 /opt/skyformai/sbin/power_ext_sched.input.json。
默认值:60秒。
power_up_cmd
在主控主机上执行的开机命令。该命令以主管理员身份执行,即administrators部分中定义的第一个用户。命令语法为”command host1 host2 …”.
power_down_cmd
在主控主机上执行的关机命令。该命令以主管理员身份执行,即administrators部分中定义的第一个用户。命令语法为”command host1 host2 …”.
节电策略插件案例#
节电策略需求#
L20的主机的队列:保持空闲3台开机,空闲12小时关机,另外7台开启节电,集中分配。
A100主机全部专属队列:没用到的机器全部关机,g001和g002是子网管理器, 至少保持一台开机。
天数GPU的主机的队列:保持空闲3台开机,空闲12小时关机,另外7台做计算队列,开启节电,集中分配
20台属于login队列的主机,不配置节电。
其他机器都属于计算队列,开起节电,按照等待作业需求开机,分批。
power_ext_sched定制开发
配置策略#
配置字典定义了不同队列的电源管理策略,包括:
max_idle_hours:主机最大允许空闲时间,超过则考虑关机。
min_idle_hosts:队列中需保持的最小空闲主机数量。
mg_hosts:管理主机列表,这些主机在关机时有特定的保护或限制。
up_batch_size:每批次开机的主机数量,防止同时开机导致电路故障。
power_ext_sched代码中,针对以上例子需求列配置如下:
config = { "g02": { "max_idle_hours": 12, "min_idle_hosts": 3, "mg_hosts": [], "up_batch_size": 0, }, "g01": { "max_idle_hours': 12, "min_idle_hosts": 1, "mg_hosts": ['g001', 'g002'], "up_batch_size": 0, }, "g21": { "max_idle_hours": 12, "min_idle_hosts": 3, "mg_hosts": [], "up_batch_size": 0, }, "c01": { "max_idle_hours": 12, "min_idle_hosts": 0, "mg_hosts": [], "up_batch_size": 5, }, }
数据库#
用SQLite数据库,文件放在:/opt/skyformai/work/power.db,存储主机开关机历史。用于:
选择最久未开机的主机进行开机,确保主机轮流使用,避免某些主机长时间未使用导致故障。
记录关机时的时间,防止频繁开关机。
数据库schema:
PWDB = '/opt/skyformai/work/power.db'
PWTABLE = 'power_hist'
PWCOLS = '(host, queue, ncpu, ngpu, memmb, uptime, offtime)'
CREATE_TABLE_SQL = 'CREATE TABLE IF NOT EXISTS %s ( \
host text PRIMARY KEY, \
queue text NOT NULL, \
ncpu integer, \
ngpu integer, \
memmb text, \
uptime integer, \
offtime integer \
)' % (PWTABLE)
主机选择策略#
开机选择
优先选择最久关机的主机,以平衡主机使用。
根据待处理作业需求,动态调整开机主机数量。
限制一次开机的主机数量,避免同时开机引发电路故障。
关机选择
针对长期空闲的主机,尤其是非管理主机,进行关机操作。
随机选择主机关机,防止特定主机长期空闲积累问题。
执行开关机动作#
关机命令“csadmin pwsave $host”
调度器会执行cb.yaml配置的关机命令power_down_cmd
“csadmin hhist”可以查到关机记录
开机命令“csadmin pwup $host”
调度器会执行cb.yaml配置的关机命令power_up_cmd
“csadmin hhist”可以查到开机记录
节电统计报表#
/opt/skyformai/bin/pwacct用于统计和报告系统中的电源节约情况。通过解析历史记录数据, 计算各主机在指定时间段内的电源节约时长和相应的电力节约量, 并以JSON格式输出统计结果。脚本支持多种命令行参数,包括指定时间范围、输出详细信息以及调试模式。
功率配置#
pwacct中的pwr_config以队列或主机名的方式配置不同主机类型的功率。 用于后续计算每个主机的电力节约量。
pwr_config = {
'queue': {
'g01': 640,
'g02': 160,
'g21': 480,
'c01': 100
},
'host': {
'node2': 100,
}
}
pwacct支持的查询参数#
–start:指定开始日期,格式为 YYYY-MM-DD。
–end:指定结束日期,格式为 YYYY-MM-DD。
–all:统计所有时间段的数据。
–long:以详细格式输出结果,包含每台主机的节电量。
–debug:启用调试模式,输出调试日志。
例子1:
pwacct
{
"save_hours": 123.88,
"save_pw": 12388.0,
"num_hosts": 1
}
例子2:
pwacct --long
{
"save_hours": 123.88,
"save_pw": 12388.0,
"num_hosts": 1,
"hosts": [
{
"host": "node2",
"power": 100,
"save_hours": 123.88,
"save_pw": 12388.0
}
]
}
例子3:
pwacct --all
{
"save_hours": 126.16,
"save_pw": 12616.0,
"num_hosts": 1
}
例子4:
pwacct --all --long
{
"save_hours": 126.16,
"save_pw": 12616.0,
"num_hosts": 1,
"hosts": [
{
"host": "node2",
"power": 100,
"save_hours": 126.16,
"save_pw": 12616.0
}
]
}