节电调度插件#

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 …”.

节电策略插件案例#

节电策略需求#

  1. L20的主机的队列:保持空闲3台开机,空闲12小时关机,另外7台开启节电,集中分配。

  2. A100主机全部专属队列:没用到的机器全部关机,g001和g002是子网管理器, 至少保持一台开机。

  3. 天数GPU的主机的队列:保持空闲3台开机,空闲12小时关机,另外7台做计算队列,开启节电,集中分配

  4. 20台属于login队列的主机,不配置节电。

  5. 其他机器都属于计算队列,开起节电,按照等待作业需求开机,分批。

  1. 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
        }
    ]
}