引言
slurm系统是一个集群,它原生的使用方式可以参考之前写的《slurm初识》和《slurm快速入门》。有时候我们想知道我们能申请哪些节点,以及各个节点的使用情况。
原生的指令大概有这两个,一个是使用squeue的方式列举出当前的工作列表。
而另一个则是sinfo。这两个命令给出的内容十分有限。
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug up 1:00:00 1 maint ceres19-compute-26
debug up 1:00:00 1 mix ceres14-compute-4
debug up 1:00:00 1 idle ceres19-compute-25
brief-low up 2:00:00 2 maint ceres19-compute-[26,40]
brief-low up 2:00:00 1 down* ceres19-compute-37
brief-low up 2:00:00 59 mix ceres18-compute-[0-17,19-27],ceres19-compute-[0-5,7-9,12,21-24,35-36,38-39,41-42,44-45,47,55-63]
brief-low up 2:00:00 4 alloc ceres18-compute-18,ceres19-compute-[6,28,43]
brief-low up 2:00:00 26 idle ceres19-compute-[10-11,13-20,25,27,29-34,46,48-54]
mem768-low up 2:00:00 3 idle ceres18-mem768-0,ceres19-mem768-[0-1]
mem-low up 2:00:00 3 mix ceres18-mem-[0-1],ceres19-mem-1
即使借鉴一些参数让给出的参数多一些,也最多能像教程里给出的那样。
sinfo -o "%20P %5D %14F %10m %11l %N"
PARTITION NODES NODES(A/I/O/T) MEMORY TIMELIMIT NODELIST
debug 3 0/3/0/3 126000+ 1:00:00 ceres14-compute-4,ceres19-compute-[25-26]
brief-low 92 33/58/1/92 381000 2:00:00 ceres18-compute-[0-27],ceres19-compute-[0-63]
priority-gpu 1 1/0/0/1 379000 14-00:00:00 ceres18-gpu-0
short* 100 51/48/1/100 126000+ 2-00:00:00 ceres14-compute-[1-24,26-29,32-39,44-56,58-67],ceres18-compute-[24-27],ceres19-compute-[27-63]
medium 67 49/17/1/67 126000+ 7-00:00:00 ceres14-compute-[26-29,32-39,44-56,58-67],ceres18-compute-[25-27],ceres19-compute-[35-63]
long 34 31/3/0/34 126000+ 21-00:00:00 ceres14-compute-[44-56,58-67],ceres18-compute-[26-27],ceres19-compute-[55-63]
mem 8 3/4/1/8 1530000+ 7-00:00:00 ceres14-mem-[0-3],ceres18-mem-2,ceres19-mem-[2-4]
mem768 1 0/1/0/1 763000 7-00:00:00 ceres18-mem768-1
huge 1 1/0/0/1 4:16:1 3095104 14990 1-00:00:00 fat,AVX,AVX2,AVX novahuge001
如果我们想要下面这样清楚的显示整个集群的使用情况,该怎么操作呢?
这样申请资源就可以使用以下命令即可:
srun --job-name=test --gres=gpu:1 -w <HOSTNAME> -p <Partition> -c 32 --pty bash
构建执行脚本
上面那么清楚的展示是怎么创造出来的呢?那显然单纯的使用slurm命令是无法满足的,这需要bash编程技术了,整个sh文件如下:
#!/bin/bash
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
# 打印标题行
printf "${GREEN}%-15s %-12s %-11s %-15s %-8s %-12s %-12s %-15s %-s${NC}\n" "Hostname" "Partition" "Node/State" "Num_CPU" "CPUload" "Memsize(MB)" "Freemem(MB)" "GRES/Node" "Joblist"
# 获取节点信息
nodes=$(sinfo -o "%N %P %T %C %O %m %e %G" -h)
# 循环每个节点
echo "$nodes" | while read node; do
# 分割节点信息
hostname=$(echo $node | awk '{print $1}')
partition=$(echo $node | awk '{print $2}')
state=$(echo $node | awk '{print $3}')
num_cpu=$(echo $node | awk '{print $4}')
cpuload=$(echo $node | awk '{print $5}')
memsize=$(echo $node | awk '{print $6}')
freemem=$(echo $node | awk '{print $7}')
gres=$(echo $node | awk '{print $8}')
# 获取与当前节点关联的作业列表
joblist=$(squeue -h -o "%i %u %b" -w $hostname | awk -v ORS=' ' '{print $1, $2, $3}')
# 根据状态设置颜色
if [[ $state == "idle" ]]; then
state_color=$GREEN
else
state_color=$RED
fi
# 输出整理好的信息
printf "%-15s %-12s ${state_color}%-11s${NC} %-15s %-8s %-12s %-12s %-15s %-s\n" $hostname $partition $state $num_cpu $cpuload $memsize $freemem $gres "$joblist"
done
看起来很复杂对吗?但是有了GPT以后,这个难度大大降低了,你只需要知道自己想要什么样子的,对他进行一个详细的描述,GPT就可以为你生成了。但是正如我之前所说,GPT只能做你知道的事情,做不到你不知道的事情。它只能像一个增益器,而不是你的替代品,因此自己的知识储备才是真本事。
如果需要每个用户能用
需要把show_clauster.sh
这个文件放入/etc/profile.d
文件夹下,并且使用命令chmod 777 show_clauster.sh
让其变为每个人都可以调用。
这样,按道理而言,每次用户使用ssh登录的时候就会有提示了。如果没有的话,可以使用source /etc/profile
的命令将其调用。