QOS拒绝策略标志
fsched 支持 QoS(Quality of Service) 拒绝策略标志,用于控制当作业超过资源限制时的行为。通过这些标志,管理员可以更细粒度地控制作业调度策略。
提示
该功能适用于 fsched 版本 10.101 及以上。
标志说明
DenyOnMaxPerJob
当设置 DenyOnMaxPerJob 标志时,如果作业请求的资源超过 QoS 配置的单作业最大资源限制(MaxTRESPerJob),作业将被立即拒绝而不是进入排队状态。
适用场景:
- 需要严格限制单个作业的资源使用
- 避免用户提交超大作业长期占用队列
DenyOnMaxPerUser
当设置 DenyOnMaxPerUser 标志时,如果作业会导致用户的资源使用超过 QoS 配置的单用户最大资源限制(MaxTRESPerUser),作业将被立即拒绝而不是进入排队状态。
适用场景:
- 需要严格限制单个用户的资源使用
- 防止单个用户占用过多集群资源
DenyOnGrp
当设置 DenyOnGrp 标志时,如果作业会导致组的资源使用超过 QoS 配置的组最大资源限制(GrpTRES),作业将被立即拒绝而不是进入排队状态。
适用场景:
- 需要严格限制组的总资源使用
- 避免某个组的作业过度占用集群资源
使用方法
查看 QoS 标志
sacctmgr show qos format=name,flags
设置拒绝策略标志
使用 sacctmgr 命令设置 QoS 标志:
# 设置单个标志
sacctmgr modify qos <qos_name> set flags=DenyOnMaxPerJob
# 设置多个标志
sacctmgr modify qos <qos_name> set flags=DenyOnMaxPerJob,DenyOnMaxPerUser
# 添加标志到现有标志
sacctmgr modify qos <qos_name> set flags+=DenyOnGrp
移除拒绝策略标志
# 移除特定标志
sacctmgr modify qos <qos_name> set flags-=DenyOnMaxPerJob
配置示例
示例1: 限制单作业资源并立即拒绝超限作业
- 创建 QoS 并设置单作业最大 CPU 数为 16
sacctmgr add qos limited_job
sacctmgr modify qos limited_job set MaxTRESPerJob=cpu=16
- 设置
DenyOnMaxPerJob标志
sacctmgr modify qos limited_job set flags=DenyOnMaxPerJob
- 为用户关联 QoS
sacctmgr modify user alice account=myaccount set qos=limited_job
- 测试:当用户 alice 提交请求超过 16 个 CPU 的作业时,作业将被立即拒绝
alice@head:~$ sbatch -n 20 job.sh
sbatch: error: Batch job submission failed: Job violates accounting/QOS policy
示例2: 限制用户总资源并立即拒绝超限作业
- 创建 QoS 并设置单用户最大 CPU 数为 32
sacctmgr add qos limited_user
sacctmgr modify qos limited_user set MaxTRESPerUser=cpu=32
- 设置
DenyOnMaxPerUser标志
sacctmgr modify qos limited_user set flags=DenyOnMaxPerUser
- 为用户关联 QoS
sacctmgr modify user bob account=myaccount set qos=limited_user
- 测试:当用户 bob 已有作业运行使用 24 个 CPU 时,再提交请求 16 个 CPU 的作业将被立即拒绝
bob@head:~$ squeue -u bob
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
101 partition job1 bob R 0:30 3 compute[1-3]
bob@head:~$ sbatch -n 16 job2.sh
sbatch: error: Batch job submission failed: Job violates accounting/QOS policy
示例3: 组合使用多个标志
- 创建 QoS 并设置多个限制
sacctmgr add qos strict_qos
sacctmgr modify qos strict_qos set MaxTRESPerJob=cpu=16
sacctmgr modify qos strict_qos set MaxTRESPerUser=cpu=32
sacctmgr modify qos strict_qos set GrpTRES=cpu=64
- 同时设置三个拒绝策略标志
sacctmgr modify qos strict_qos set flags=DenyOnMaxPerJob,DenyOnMaxPerUser,DenyOnGrp
这样配置后:
- 单个作业请求超过 16 个 CPU 将被拒绝
- 用户总使用超过 32 个 CPU 时新作业将被拒绝
- 组总使用超过 64 个 CPU 时新作业将被拒绝
行为对比
不设置拒绝策略标志(默认行为)
作业超过资源限制时会进入 PENDING 状态,等待资源释放后才能运行。
bob@head:~$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
102 partition job2 bob PD 0:00 1 (MaxCpuPerUser)
101 partition job1 bob R 0:30 3 compute[1-3]
设置拒绝策略标志后
作业超过资源限制时会被 立即拒绝,提交失败。
bob@head:~$ sbatch job2.sh
sbatch: error: Batch job submission failed: Job violates accounting/QOS policy
注意事项
注意
- 拒绝策略标志会使作业提交失败而不是等待,请根据实际需求选择是否启用
- 这些标志仅影响超过限制的新提交作业,不影响已在运行的作业
- 建议在启用拒绝策略前,先通过不设置标志的方式测试资源限制是否合理
- 拒绝策略标志与
DenyOnLimit标志不同:DenyOnLimit针对所有限制类型,而这三个标志可以分别针对不同类型的限制