跳到主要内容

任务提交Lua插件

Job Submit Plugin是运行在头节点上的插件,在用户任务请求提交到头节点后、任务实际入队前运行。

作用

Job Submit Plugin可以对任务进行以下操作:

  • 修改任务提交信息,例如修改任务的分区、核心以及内存数量
  • 检查任务的信息,判断是否允许执行等

安装配置

slurm.conf 中添加:

JobSubmitPlugins=job_submit/lua

将Lua脚本保存到 /etc/slurm/job_submit.lua

支持的函数

-- 在任务提交时执行
function slurm_job_submit(job_desc, part_list, submit_uid)
end

-- 在修改任务的时候执行
function slurm_job_modify(job_desc, job_rec, part_list, modify_uid)
end

参数:

  • job_desc: 任务描述信息
  • part_list: 所有分区信息
  • submit_uid: 提交用户的UID
  • job_rec: 当前任务记录(仅job_modify)
  • modify_uid: 修改操作的用户UID(仅job_modify)

数据结构

Job Descriptor (job_desc)

字段名称类型描述
accountstring作业的账户名称
admin_commentstring管理员评论
array_task_cntnumber数组任务的数量
batch_featuresstring作业的批处理特性
burst_bufferstring作业的突发缓冲区
commentstring作业的评论
cpus_per_tresstring每个 TRES (资源管理器) 的 CPU 数量
delay_bootnumber延迟启动时间
direct_set_prionumber直接设置的优先级
featuresstring作业的特性
gresstring资源请求的 GRES (可扩展资源)
group_idnumber作业的组 ID
job_idnumber作业的 ID
job_statenumber作业的状态
licensesstring作业的许可证
max_cpusnumber作业可用的最大 CPU 数量
max_nodesnumber作业可用的最大节点数
mem_per_tresstring每个 TRES 分配的内存
min_cpusnumber作业请求的最小 CPU 数量
min_mem_per_nodenumber每个节点的最小内存需求
min_mem_per_cpunumber每个 CPU 的最小内存需求
min_nodesnumber作业请求的最小节点数
namestring作业名称
nicenumber作业的优先级偏移量 (调度优先级)
pack_job_idnumber打包作业 ID
pack_job_id_setstring打包作业 ID 设置
pack_job_offsetnumber打包作业偏移量
partitionstring作业所属的分区,注意为请求值,可能为空
pn_min_cpusnumber每个节点的最小 CPU 数量
pn_min_memorynumber每个节点的最小内存 (64 位整数)
prioritynumber作业的优先级
qosstring作业的质量服务 (QoS)
rebootnumber作业的重启设置
req_switchnumber作业请求的交换机信息
site_factornumber站点因子,通常用于调度策略
spank_job_envtableSPANK (Slurm插件) 作业环境变量
spank_job_env_sizenumberSPANK 作业环境变量的大小
time_limitnumber作业的时间限制
time_minnumber作业的最短时间限制
tres_bindstringTRES 绑定信息
tres_freqstringTRES 频率信息
tres_per_jobstring每个作业的 TRES 数量
tres_per_nodestring每个节点的 TRES 数量
tres_per_socketstring每个插槽的 TRES 数量
tres_per_taskstring每个任务的 TRES 数量
user_idnumber用户 ID
user_namestring用户名称
wait4switchnumber作业等待交换机的状态
wckeystring作业的工作流键值 (workload key)

Partition (part_list)

字段名称类型描述
allow_accountsstring允许的账户名称
allow_alloc_nodesstring允许分配的节点名称
allow_groupsstring允许的用户组名称
allow_qosstring允许的 QoS 设置
alternatestring替代的分区名称
billing_weights_strstring分区的账单权重字符串
default_timenumber默认时间限制 (分钟)
def_mem_per_cpunumber每个 CPU 的默认内存需求 (如果是按 CPU 分配)
def_mem_per_nodenumber每个节点的默认内存需求
deny_accountsstring拒绝的账户名称
deny_qosstring拒绝的 QoS 设置
flag_defaultnumber是否为默认分区 (0: 否, 1: 是)
flagsnumber分区的标志字段 (例如是否启用等)
max_cpus_per_nodenumber每个节点允许的最大 CPU 数量
max_mem_per_cpunumber每个 CPU 的最大内存需求
max_mem_per_nodenumber每个节点的最大内存需求
max_nodesnumber最大节点数
max_nodes_orignumber原始最大节点数
max_sharenumber最大共享比例
max_timenumber最大时间限制 (分钟)
min_nodesnumber最小节点数
min_nodes_orignumber原始最小节点数
namestring分区名称
nodesstring节点列表
priority_job_factornumber作业优先级因子
priority_tiernumber优先级等级
qosstringQoS 设置
state_upnumber分区是否处于活动状态 (0: 不活跃, 1: 活跃)

全局对象 slurm

日志函数

字段/函数名描述
log_error记录错误日志
log_info记录信息日志(级别0)
log_verbose记录详细日志(级别1)
log_debug记录调试日志(级别2)
log_debug2记录更详细的调试日志(级别3)
log_debug3记录更详细的调试日志(级别4)
log_debug4记录最详细的调试日志(级别5)
log_user记录用户消息

错误代码

字段/函数名描述
ERROR表示一般错误
FAILURE表示操作失败
SUCCESS表示操作成功
ESLURM_ACCESS_DENIED访问被拒绝
ESLURM_ACCOUNTING_POLICY会计策略错误
ESLURM_INVALID_ACCOUNT无效的账户
ESLURM_INVALID_LICENSES无效的许可证
ESLURM_INVALID_NODE_COUNT无效的节点计数
ESLURM_INVALID_TIME_LIMIT无效的时间限制
ESLURM_JOB_MISSING_SIZE_SPECIFICATION作业缺少大小规格
ESLURM_MISSING_TIME_LIMIT缺少时间限制

其他定义

字段/函数名描述
ALLOC_SID_ADMIN_HOLD管理员保留的分配ID
ALLOC_SID_USER_HOLD用户保留的分配ID
INFINITE无限值
INFINITE6464位无限值
MAIL_JOB_BEGIN作业开始时发送邮件
MAIL_JOB_END作业结束时发送邮件
MAIL_JOB_FAIL作业失败时发送邮件
MAIL_JOB_REQUEUE作业重新排队时发送邮件
MAIL_JOB_TIME100作业时间达到100%时发送邮件
MAIL_JOB_TIME90作业时间达到90%时发送邮件
MAIL_JOB_TIME80作业时间达到80%时发送邮件
MAIL_JOB_TIME50作业时间达到50%时发送邮件
MAIL_JOB_STAGE_OUT作业阶段结束时发送邮件
MEM_PER_CPU每个CPU的内存
NICE_OFFSET优先级偏移量
JOB_SHARED_NONE作业不共享
JOB_SHARED_OK作业共享
JOB_SHARED_USER用户共享作业
JOB_SHARED_MCSMCS共享作业
NO_VAL6464位无效值
NO_VAL无效值
NO_VAL1616位无效值
NO_VAL88位无效值
SHARED_FORCE强制共享

作业描述位标志

字段/函数名描述
GRES_DISABLE_BIND禁用资源绑定
GRES_ENFORCE_BIND强制资源绑定
KILL_INV_DEP杀死无效依赖
NO_KILL_INV_DEP不杀死无效依赖
SPREAD_JOB分散作业
USE_MIN_NODES使用最小节点数

全局函数

字段/函数名描述
log通用log函数: log(level, msg)
error错误日志: error(msg)
time_str2minsslurm格式的时间格式,输出分钟

使用示例

示例1: 限制部分用户使用部分分区

-- list of UIDs to reistrict from submmitting
local uids_to_restrict = {
2000,
2001,
}

-- partitions to restrict user to submit to
local partitions_to_restrict = {
"Compute",
}

local function get_default_partition(part_list)
for name, part in pairs(part_list) do
if part.flag_default == 1 then
return name
end
end
return nil
end

-- slurm_job_submit: process the submitted job requests
function slurm_job_submit(job_desc, part_list, submit_uid)
-- if submit_uid is in the list of uids to restrict, then check if the job is targeting the restricted partition
if submit_uid == 0 then
return slurm.SUCCESS
end

local to_check = false
for _, uid in ipairs(uids_to_restrict) do
if submit_uid == uid then
slurm.log_info("User " .. submit_uid .. " is in the list of uids to restrict")
to_check = true
break
end
end
if not to_check then
return slurm.SUCCESS
end

-- check if the job is targeting the restricted partition
local partition = job_desc.partition
if not partition then
-- this is for default partition
partition = get_default_partition(part_list)
end
if not partition then
slurm.log_error("Partition not found")
return slurm.ERROR
end

for _, part in ipairs(partitions_to_restrict) do
if partition == part then
slurm.log_info("User " .. submit_uid .. " is not allowed to submit jobs to partition " .. partition)
return slurm.ESLURM_ACCESS_DENIED
end
end

return slurm.SUCCESS
end

-- slurm_job_modify: called when a job is modified
function slurm_job_modify(job_desc, job_rec, part_list, modify_uid)
return slurm.SUCCESS
end

示例2: 修改用户在某个分区提交时的默认参数

--[[
* Slurm Job Submit Lua Plugin
*
* This plugin performs two main functions:
* 1. For jobs submitted to a specific partition, it automatically sets the cpus_per_task value.
*
]]--


-- Partition where cpus_per_task should be modified.
local partition_to_modify = "SpecificPartition"

-- The new value for cpus_per_task for the specified partition.
local cpus_per_task = 4

--[[ Plugin Functions --]]
-- slurm_job_submit: process the submitted job requests.
function slurm_job_submit(job_desc, part_list, submit_uid)
-- This check handles default system processes.
if submit_uid == 0 then
return slurm.SUCCESS
end

-- Determine the target partition for the job.
local partition = job_desc.partition
if not partition then
return slurm.SUCCESS
end

-- Logic to change cpus_per_task for a specific partition.
if partition == partition_to_modify then
job_desc.cpus_per_task = cpus_per_task
end
return slurm.SUCCESS
end

function slurm_job_modify(job_desc, job_rec, part_list, modify_uid)
return slurm.SUCCESS
end