返回文章列表
HPCSlurmLinux调度优化

HPC 集群 Slurm 作业调度优化实战指南

谢工

背景

在高性能计算(HPC)环境中,Slurm 是最广泛使用的作业调度系统之一。然而,很多用户和运维人员并未充分发挥 Slurm 的调度能力,导致资源利用率和作业吞吐量远低于预期。

作业提交脚本优化

1. 精确的资源请求

#!/bin/bash
#SBATCH --job-name=optimized_job
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=32
#SBATCH --cpus-per-task=1
#SBATCH --gres=gpu:4
#SBATCH --time=02:00:00
#SBATCH --mem=256G
#SBATCH --partition=gpu

关键点

  • --cpus-per-task 要与 GPU 卡数匹配
  • --mem 不要使用默认值,根据实际需求设置
  • --time 设置合理的运行时间上限

2. 使用 Job Array 处理参数扫描

#SBATCH --array=0-99
#SBATCH --ntasks=1

# 根据任务ID加载不同参数
INPUT_FILE="input_${SLURM_ARRAY_TASK_ID}.dat"
srun ./simulation $INPUT_FILE

Job Array 可以显著减少调度开销,比逐个提交 100 个独立作业效率高得多。

调度策略配置

Multi-Factor Priority 插件

# slurm.conf
PriorityType=priority/multifactor
PriorityWeightAge=1000
PriorityWeightFairshare=2000
PriorityWeightJobSize=500
PriorityWeightPartition=1000
PriorityWeightQOS=5000

合理的权重配置可以平衡资源公平性和作业吞吐量。

分区(Partition)划分策略

PartitionName=debug      Nodes=node[01-02] Default=NO      MaxTime=00:30:00
PartitionName=compute    Nodes=node[03-20] Default=YES     MaxTime=48:00:00
PartitionName=gpu        Nodes=gpu[01-08]  Default=NO      MaxTime=24:00:00
PartitionName=highmem    Nodes=mem[01-02]  Default=NO      MaxTime=72:00:00

资源利用率监控

# 实时监控
watch -n 5 'sinfo -o "%P %D %t %C %m"'

# 查看作业效率
seff $JOBID

# 历史统计
sacct -j $JOBID --format=JobID,Elapsed,TotalCPU,MaxRSS,MaxVMSize,ExitCode

常见问题与排查

作业长时间 PENDING

# 查看排队原因
scontrol show job $JOBID | grep Reason
# 查看节点状态
sinfo -t idle,alloc,mix,drain
# 查看作业优先级
sprio -j $JOBID

内存不足导致作业失败

使用 sacct 查看实际内存使用:

sacct -j $JOBID --format=ReqMem,MaxRSS,MaxVMSize

如果 MaxRSS 接近 ReqMem,说明需要增大内存请求。

总结

Slurm 调度优化是一个系统工程,需要从用户作业脚本、集群配置和运维策略三个层面同时着手。最重要的是做到 合理的资源请求 + 合适的调度策略 + 持续的监控分析


下一期将介绍 GPU 集群的调度优化实践,敬请期待。

谢工

AI Agent / HPC 工程师

更多文章