托管版PowerSaving Slurm集群最佳实践

更新时间:
复制为 MD 格式

托管版PowerSaving Slurm集群为队列预注册虚拟节点,作业提交时自动创建ECS实例,作业完成后自动释放,空闲期不产生计算费用。

业务场景

HPC作业负载呈明显的波峰波谷特征——批量提交时需要大量算力,间歇期几乎无资源消耗。静态集群的常驻节点在空闲期持续产生费用。PowerSaving模式将计算资源与作业生命周期绑定:调度器预注册一组虚拟节点,作业提交时自动创建ECS实例,空闲超时后自动释放,计算费用仅在作业运行期间产生。

PowerSaving工作机制

Slurm调度器为队列预注册一批虚拟节点(idle~状态),这些节点在调度器中可见但不占用ECS资源。作业提交后,调度器创建ECS实例(alloc#状态),实例就绪后执行作业(alloc状态)。作业完成后节点进入空闲计时,超过阈值(默认1分钟)后释放实例,节点回到idle~状态。

节点状态标识与转换流程:

符号

状态

含义

~

POWERED_DOWN

节点处于断电状态,无实际ECS资源,可接受作业调度

#

POWERING_UP

正在创建ECS实例,等待实例就绪

(无后缀)

POWER_UP

ECS实例已就绪,节点正常运行中

!

POWER_DOWN

节点收到断电信号,即将进入释放流程,此状态持续时间极短

%

POWERING_DOWN

正在释放ECS实例

典型转换路径:idle~ → alloc# → alloc → idle → idle! → idle% → idle~

更多细节参见Slurm Power Saving官方文档

创建托管版Slurm集群

集群创建约需10~15分钟,未提及的参数按需填写。

  1. 创建标准版集群,使用以下配置。

    配置项

    示例值

    系列

    托管版

    部署模式

    公共云集群

    集群类型

    SLURM

    集群最大节点数

    1000(根据业务峰值规模设置)

    队列节点数

    创建集群时跳过,集群就绪后单独配置PowerSaving队列

    共享文件存储

    默认挂载/home/opt为共享存储目录

    登录节点

    实例规格ecs.c7.large(2 vCPU / 4 GiB),镜像CentOS 7.6 64位,按需开启EIP

  2. 进入集群详情页面。

    1. 登录弹性高性能计算控制台

    2. 在顶部菜单栏左上角处,选择地域。

    3. 在左侧导航栏,单击集群

    4. 集群列表页面,单击目标集群名称

  3. 在左侧导航栏,单击用户管理

  4. 作业需以非root用户提交。在用户管理页面,单击新增用户

  5. 在弹出的对话框中配置用户信息,以usertest为例。

    • 用户名:usertest。

    • 用户权限:选择普通权限组,适用于提交和调试作业的用户。

    • 密码确认密码:设置登录密码。

配置PowerSaving队列

集群就绪后,配置PowerSaving队列定义弹性伸缩行为。

  1. 在集群列表页面,单击目标集群名称。

  2. 在左侧导航栏,选择节点与队列 > 队列

  3. 单击创建队列,参照以下配置填写参数。

基础设置

配置项

示例值与说明

队列名称

testq

队列自动伸缩

开启。开启后队列根据作业负载自动创建和释放节点。

队列节点数

0 - 20。系统预注册20个虚拟节点并分配主机名和IP,弹性伸缩从此节点池中选取。

节点配置

配置项

示例值与说明

节点间互联

VPC网络

虚拟交换机

选择队列所在的交换机(如vsw-bp*******************),系统据此确定可用区并预创建节点

实例规格组

通用型g7 / ecs.g7.large / CentOS 7.6 64位 / 40G ESSD PL0系统盘。多个规格须保持同构,仅第一个生效。根据可用区库存选择可用规格。

自动伸缩

配置项

示例值与说明

伸缩策略

供应优先策略。按可用区顺序优先供应,尽可能满足规模要求。

主机名前缀

testq,系统根据此前缀自动生成节点序号(如testq001、testq002)

提交作业与自动扩缩容验证

队列配置完成后,提交一个CPU压测作业验证自动扩缩容流程。

连接集群并确认节点状态

  1. 集群列表页面,单击目标集群名称

  2. 在右上角选项栏,选择远程连接

  3. 进入Workbench页面后,运行sinfo命令,确认节点testq[001-020]处于idle~状态。

安装测试工具并提交作业

  1. 安装stress压测工具到/opt共享目录,确保所有计算节点可访问。

cd /tmp
wget https://fossies.org/linux/privat/stress-1.0.7.tar.gz
tar -xzf stress-1.0.7.tar.gz
cd stress-1.0.7/
./configure --prefix=/opt/stress
make && make install
  1. 确认安装成功。

/opt/stress/bin/stress --version
  1. 切换到usertest用户并进入主目录。

su usertest
cd ~
  1. 编写作业脚本cpu_stress.slurm,申请testq队列的1个节点、2CPU核心,运行10分钟压测。

cat > cpu_stress.slurm << EOF
#!/bin/bash
#SBATCH --job-name=cpu_stress_test
#SBATCH --partition=testq
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=2
#SBATCH --time=00:10:00
#SBATCH --output=cpu_stress_%j.out
#SBATCH --error=cpu_stress_%j.err

echo "=== CPU Stress Test ==="
echo "Job ID: \$SLURM_JOB_ID"
echo "Node: \$(hostname)"
echo "Requested CPUs: \$SLURM_CPUS_PER_TASK"
echo "Start time: \$(date)"

NUM_CPUS=\${SLURM_CPUS_PER_TASK:-\$(nproc)}

if command -v /opt/stress/bin/stress >/dev/null 2>&1; then
    /opt/stress/bin/stress --cpu \$NUM_CPUS --timeout \${SLURM_TIME_LIMIT:-600}
else
    echo "ERROR: stress is not installed"
    exit 1
fi

echo "End time: \$(date)"
echo "=== CPU Stress Test Completed ==="
EOF
  1. 提交作业到testq队列。

sbatch -p testq cpu_stress.slurm

观察自动扩容与缩容

作业提交后,运行sinfosqueue观察节点状态变化:

  1. 扩容阶段sinfo显示节点处于alloc#状态,表示ECS实例正在创建。控制台中对应的testq001节点显示为初始化状态。

  2. 运行阶段:节点转为alloc状态,squeue显示作业处于R(Running)状态。控制台中testq001节点CPU处于高负载。

  3. 缩容阶段:作业完成后,节点空闲超过1分钟自动回收。作业输出保存在cpu_stress_<job_id>.out中。

    === CPU Stress Test ===
    Job ID: 1
    Node: testq001
    Requested CPUs: 2
    Start time: Tue Feb 10 19:30:24 CST 2026
    Using stress (fallback)
    stress: info: [14051] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd

    节点完成回收后,testq001重新变为idle~状态,ECS实例已释放。

限制项

  • 地域限制:仅支持杭州、北京、河源、上海。

  • 单集群节点上限为1000。

  • 队列仅支持单可用区、单规格、同构实例规格。

  • 队列不支持例外节点、不支持修改主机前缀、不支持超线程(HT)和eRDMA。

  • 每队列节点数上限为500。

  • 不支持手动扩容和缩容。

  • 不支持srunMPI作业,仅支持sbatch批处理作业。