提交SLURM作业仅指定总任务数,如何获取各节点分配核心数及更优方法?
答案:当然可以!这里有几种高效的方法来获取节点核心分配信息,不用手动解析
scontrol的冗长输出 方法1:用sacct直接生成目标格式(最简方案)
如果你只需要快速生成nodeXX:YY空格分隔的机器文件格式,直接在作业脚本里运行这条命令就行:
sacct -j $SLURM_JOB_ID --format=NodeList,CPUTaskRaw --noheader | awk '{print $1 ":" $2}' | paste -sd " " -
拆解说明:
sacct -j $SLURM_JOB_ID:针对当前运行的作业查询资源分配--format=NodeList,CPUTaskRaw:仅提取节点名和每个节点分配的核心数(CPUTaskRaw就是单节点核心数)--noheader:去掉冗余的表头行awk '{print $1 ":" $2}':把每行的节点和核心数用冒号拼接paste -sd " " -:把所有行合并成一行,用空格分隔
如果你的节点是范围格式(比如node[02-04]),想要展开成单个节点名,只需要加一步scontrol show hostnames的处理:
# 先获取展开后的节点列表和对应的核心数 sacct -j $SLURM_JOB_ID --format=NodeList,CPUTaskRaw --noheader | while read node_range cpus; do scontrol show hostnames $node_range | while read node; do echo "$node:$cpus" done done | paste -sd " " -
方法2:用SLURM环境变量自定义脚本(更灵活)
如果需要更精细的控制(比如写入文件、后续逻辑处理),可以直接利用SLURM提供的环境变量,结合简单的bash脚本展开压缩格式:
# 定义一个函数,展开SLURM_JOB_CPUS_PER_NODE的压缩格式(比如"8(x2),7" → "8 8 7") expand_cpu_allocation() { echo "$1" | tr ',' '\n' | while read segment; do if [[ $segment =~ ^([0-9]+)\(x([0-9]+)\)$ ]]; then # 处理重复节点的情况,比如8(x2)表示2个节点各8核 core_count=${BASH_REMATCH[1]} node_count=${BASH_REMATCH[2]} for ((i=0; i<node_count; i++)); do echo -n "$core_count "; done else # 单个节点的核心数 echo -n "$segment "; fi done } # 获取展开后的节点列表(每个节点一行) IFS=$'\n' read -d '' -r -a node_list < <(scontrol show hostnames "$SLURM_JOB_NODELIST") # 获取展开后的核心数列表 IFS=' ' read -r -a core_list < <(expand_cpu_allocation "$SLURM_JOB_CPUS_PER_NODE") # 生成目标格式的字符串 machine_string="" for index in "${!node_list[@]}"; do machine_string+="${node_list[$index]}:${core_list[$index]} " done # 移除末尾多余的空格 machine_string=$(echo "$machine_string" | sed 's/ $//') # 输出结果或者写入文件 echo "$machine_string" # echo "$machine_string" > my_machine_file.txt
关键环境变量说明:
$SLURM_JOB_NODELIST:作业分配的节点列表(可能是范围格式,比如node[02-06])$SLURM_JOB_CPUS_PER_NODE:每个节点分配的核心数(压缩格式,比如7,14(x2),3)$SLURM_JOB_ID:当前作业的唯一ID
为什么这比scontrol show jobid -dd更好?
- 直接提取你需要的节点+核心数信息,完全过滤掉
scontrol输出的冗余配置(比如内存、优先级、提交时间等) - 可以直接在作业脚本中自动化处理,不用手动复制粘贴或者解析大段文本
- 两种方法都支持压缩格式的节点/核心数,不需要手动展开范围
内容的提问来源于stack exchange,提问作者Lorenzo Cozzi
相关产品推荐
相关产品推荐

